第一次使用 MongoTemplate 保存文档

Saving document the first time with MongoTemplate

我在第一次使用 MongoTemplate 保存文档时遇到问题。 我有很多记录同时到达服务器,这些记录具有相同的身份,所以我将先到达的记录保存在 mongo 中,所有其他记录将更新保存的文档。

示例:

record1(id=x) , record2(id=x),record3(id=x),record4(id=x),record5(id=x),record6(id=x),.....

我只需要保存 record1(id=x) ,其他的都可以更新文档。

因为并发,很多记录都是第一时间保存的。 在进行其他逻辑解决之前,是否有针对此问题的内置解决方案。

基本解决方案称为 "upsert". It is a built in function on a MongoDB .update() 方法并贯穿所有驱动程序。

就像对 .update() 方法的任何调用一样,这需要两个基本参数,由 "query" 对象和 "update" 对象组成。 "update"对象使用operators to define the behavior of an update. There is a third option in the general command form that allow the option to "upsert"设置。

考虑 shell 中的以下语句:

db.collection.update({ "_id": 1 },{ "$inc": { "counter": 1 } },{ "upsert" true })
db.collection.update({ "_id": 1 },{ "$inc": { "counter": 2 } },{ "upsert" true })
db.collection.update({ "_id": 1 },{ "$inc": { "counter": 3 } },{ "upsert" true })

这将在第一个语句中创建一个 "counter" 值为 1 的新文档。随后的语句将分别递增 23。无论语句执行顺序如何,最后只有一个文档"counter"值为6.

在 Spring 数据 MongoDB 中,mongoOperations class 实例有一个名为 .upsert() 的方法,它做同样的基本事情。

mongoOperations.upsert(query,update,Class.class)

对于您提出的具体问题(只是保存一个对象),您应该使用 MongoTemplate 的 save() 方法。有关文档,请参阅 here

您还询问了示例中的并发性,MongoDB 保证每个文档的原子性。但是你应该知道跨文档原子性在MongoDB

中没有提供