使用MongoTemplate首次保存文档

时间:2015-01-06 00:23:33

标签: java spring mongodb mongodb-query spring-data-mongodb

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

示例:

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

我只需要保存record1(id=x),以及所有其他人来更新文档。

由于并发性,第一次保存了许多记录。 在进行其他逻辑工作之前,是否有针对此问题的内置解决方案。

2 个答案:

答案 0 :(得分:1)

基本解决方案称为"upsert"。它是MongoDB .update()方法的内置函数,并通过所有驱动程序。

就像调用.update()方法一样,这需要两个基本参数,包括"查询"对象和"更新"宾语。 "更新" object使用operators来定义更新的行为。一般命令表单中有第三个选项,允许设置"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 })

将在第一个语句中创建一个带有"计数器"的新文档。值1。后续语句将分别在23中递增。无论语句执行的顺序如何,最后只有一个文档带有"计数器"价值6

在Spring数据MongoDB中,mongoOperations类实例有一个名为.upsert()的方法,该方法执行相同的基本操作。

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

答案 1 :(得分:0)

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

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