无法进行批量更新插入使用蒙戈

问题描述:

我试图做UPSERT使用MongoDB的驱动程序,这里是一个代码:无法进行批量更新插入使用蒙戈

BulkWriteOperation builder = coll.initializeUnorderedBulkOperation(); 
DBObject toDBObject; 
for (T entity : entities) { 
    toDBObject = morphia.toDBObject(entity); 
    builder.find(toDBObject).upsert().replaceOne(toDBObject); 
} 
BulkWriteResult result = builder.execute(); 

其中“实体”是吗啡的对象。当我第一次运行代码时(数据库中没有实体,所以所有查询都应该是insert),它工作正常,我看到数据库中的实体与生成的_id字段。第二轮我改变了一些字段,并试图保存更改的实体,然后我收到蒙戈如下因素的错误:

E11000 duplicate key error collection: statistics.counters index: _id_ dup key: { : ObjectId('56adfbf43d801b870e63be29') } 

什么我忘了在我的例子来配置?

+0

为什么.find首先?你可以使用。插件并跳过.find? – bri

+0

我从mongodb手册中获取了一个示例: https://docs.mongodb.org/v3.0/reference/method/Bulk.find.upsert/ –

+0

此外,没有用于BulkWriteOperation.upsert()的API。 –

我不知道dbObject的结构,但是批量Upsert需要一个有效的查询才能工作。

比方说,你有一个叫做“id”的唯一(_id)属性。有效查询看起来像:

builder.find({id: toDBObject.id}).upsert().replaceOne(toDBObject); 

这样,发动机可以(一)找对象要更新,然后(二)更新(或插入,如果没有找到对象)。当然,您需要用于查找的Java语法,但适用相同的规则:确保您的.find会找到某个内容,然后执行更新。

我相信(只是猜测)它现在写的方式会找到“所有”文档并尝试更新第一个文档...但是您描述的行为表明它找到“没有文档”并尝试插。