MongoDB“_id";通过MongoDB组件保存时为空

MongoDB“_id";通过MongoDB组件保存时为空,mongodb,apache-camel,Mongodb,Apache Camel,我们正在使用MongoDB 2.6.12,最近将Camel升级到2.18.1,“MongoJava驱动程序”升级到3.4.1 我们正在使用Camel组件“Camel mongodb”,并且有一条路线: <camel:route id="save"> <from uri="direct:save"/> <camel:process ref="myProcessor"/> <camel:to uri="

我们正在使用MongoDB 2.6.12,最近将Camel升级到2.18.1,“MongoJava驱动程序”升级到3.4.1

我们正在使用Camel组件“Camel mongodb”,并且有一条路线:

    <camel:route id="save">
        <from uri="direct:save"/>
        <camel:process ref="myProcessor"/>
        <camel:to uri="mongodb:mongoDBConnectionBean?database=abc&amp;collection=xyz&amp;operation=save"/>
    </camel:route>
结果是对象存储在MongoDB中,但由于某种原因,“\u id”字段被设置为“null”。这以前从未发生过


更新: 我仔细查看了org.apache.camel.component.mongodb.MongoDbProducer.createDoSave,其中的代码执行“upsert”:

现在在我看来,问题是“replaceOne”上的MongoDB接受“queryObject”的“\u id”(在我的例子中为null),并插入带有此“\u id”的“saveObj”。(请参阅:)

这种行为也可以在mongo shell中看到:

> db.abc.replaceOne({"_id":null}, {"test":"1"}, {"upsert": true})
> db.abc.find()
{ "_id" : null, "test" : "1" }

因此,一方面,我认为这是mongo camel组件代码中的一个问题;另一方面,我认为我肯定遗漏了一些东西,因为其他很多人都会遇到这个问题。

我已经调试了camel mongo代码,可以直接使用java mongo驱动程序进行复制(与camel mongo代码一样)。我为此创建了另一个问题:如果您所做的只是插入,则只需使用
insert
操作。如果要执行保存,请确保在更新之前先检索整个对象。我也有同样的问题。这是非常糟糕的“改进”“在camel mongo组件中。我使用“save”操作,因为有时它是更新的,有时是插入的/现在,我应该在保存之前检查对象,并使用具有不同操作的两个端点/我已经调试了camel mongo代码,并且可以直接使用java mongo驱动程序进行复制(执行与camel mongo代码相同的操作)。我为此提出了另一个问题:如果您所做的只是插入,那么只需使用
insert
操作。如果要保存,请确保在更新之前先检索整个对象。我也有同样的问题。camel mongo组件的“改进”非常糟糕。我使用“保存”操作,因为有时是更新操作,有时是插入操作,现在,我应该在保存之前检查对象,并使用具有不同操作的两个端点/
MongoCollection e = this.calculateCollection(exchange1);
BasicDBObject saveObj = (BasicDBObject)exchange1.getIn().getMandatoryBody(BasicDBObject.class);
UpdateOptions options = (new UpdateOptions()).upsert(true);
BasicDBObject queryObject = new BasicDBObject("_id", saveObj.get("_id"));
UpdateResult result = e.replaceOne(queryObject, saveObj, options);
> db.abc.replaceOne({"_id":null}, {"test":"1"}, {"upsert": true})
> db.abc.find()
{ "_id" : null, "test" : "1" }