第一次使用 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
的新文档。随后的语句将分别递增 2
和 3
。无论语句执行顺序如何,最后只有一个文档"counter"值为6
.
在 Spring 数据 MongoDB 中,mongoOperations class 实例有一个名为 .upsert()
的方法,它做同样的基本事情。
mongoOperations.upsert(query,update,Class.class)
对于您提出的具体问题(只是保存一个对象),您应该使用 MongoTemplate 的 save() 方法。有关文档,请参阅 here。
您还询问了示例中的并发性,MongoDB 保证每个文档的原子性。但是你应该知道跨文档原子性在MongoDB
中没有提供
我在第一次使用 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
的新文档。随后的语句将分别递增 2
和 3
。无论语句执行顺序如何,最后只有一个文档"counter"值为6
.
在 Spring 数据 MongoDB 中,mongoOperations class 实例有一个名为 .upsert()
的方法,它做同样的基本事情。
mongoOperations.upsert(query,update,Class.class)
对于您提出的具体问题(只是保存一个对象),您应该使用 MongoTemplate 的 save() 方法。有关文档,请参阅 here。
您还询问了示例中的并发性,MongoDB 保证每个文档的原子性。但是你应该知道跨文档原子性在MongoDB
中没有提供