无法进行批量更新插入使用蒙戈
问题描述:
我试图做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') }
什么我忘了在我的例子来配置?
答
我不知道dbObject的结构,但是批量Upsert需要一个有效的查询才能工作。
比方说,你有一个叫做“id”的唯一(_id)属性。有效查询看起来像:
builder.find({id: toDBObject.id}).upsert().replaceOne(toDBObject);
这样,发动机可以(一)找对象要更新,然后(二)更新(或插入,如果没有找到对象)。当然,您需要用于查找的Java语法,但适用相同的规则:确保您的.find会找到某个内容,然后执行更新。
我相信(只是猜测)它现在写的方式会找到“所有”文档并尝试更新第一个文档...但是您描述的行为表明它找到“没有文档”并尝试插。
为什么.find首先?你可以使用。插件并跳过.find? – bri
我从mongodb手册中获取了一个示例: https://docs.mongodb.org/v3.0/reference/method/Bulk.find.upsert/ –
此外,没有用于BulkWriteOperation.upsert()的API。 –