Spring MongoTemplate upsert整个列表

时间:2017-12-04 04:12:50

标签: java spring mongodb upsert

我有一个我要插入集合的对象列表。 mongoTemplate.insert(list);工作正常但现在我想将其修改为upsert();,因为我的列表可以包含已插入集合中的重复对象。所以我想要的是插入整个列表并随时检查该项目是否已经存在于集合中,然后跳过它,否则插入它。

3 个答案:

答案 0 :(得分:0)

您可以尝试continueOnErrorordered这样的标记:

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);

(免责声明:我只输入此代码,我从未运行它)