我有一个我要插入集合的对象列表。 mongoTemplate.insert(list);
工作正常但现在我想将其修改为upsert();
,因为我的列表可以包含已插入集合中的重复对象。所以我想要的是插入整个列表并随时检查该项目是否已经存在于集合中,然后跳过它,否则插入它。
答案 0 :(得分:0)
您可以尝试continueOnError
或ordered
这样的标记:
db.collection.insert(myArray, {continueOnError: true})
OR,
db.collection.insert(myArray, {ordered: false})
答案 1 :(得分:0)
您需要为对象unique
创建id
索引字段(如果没有唯一约束)。因此,当您尝试使用相同的id
插入时会出错。
使用唯一约束,您可以插入array
或使用BulkInsert
对于使用insert
,您可以设置一个标记continueOnError: true
,只要在插入现有id
对象时由于唯一约束而发生错误,就可以继续插入。
答案 2 :(得分:0)
执行批量upsert操作的唯一方法是方法MongoCollection.bulkWrite
(或者至少:我知道的唯一方法......; - )
要使用它,您必须将文档转换为适当的WriteModel
:对于每个文档的upsert,这是UpdateOneModel
。
List<Document> toUpdate = ...;
MongoCollection coll = ...;
// Convert Document to UpdateOneModel<Document>
List<UpdateOneModel<Document>> bulkOperationList = toUpdate.stream()
.map(doc -> new UpdateOneModel<Document>(
Filters.eq("_id", doc.get("_id")), // identify by same _id
doc,
new UpdateOptions().upsert(true)))
.collect(Collectors.toList());
// Write to DB
coll.bulkWrite(bulkOperationList);
(免责声明:我只输入此代码,我从未运行它)