我第一次使用MongoTemplate时遇到了保存文档的问题。 我有很多记录同时来到服务器,这些记录具有相同的标识,所以我保存了mongo中的第一个到达记录,所有其他记录将更新保存的文件。
示例:
record1(id=x) , record2(id=x),record3(id=x),record4(id=x),record5(id=x),record6(id=x),.....
我只需要保存record1(id=x)
,以及所有其他人来更新文档。
由于并发性,第一次保存了许多记录。 在进行其他逻辑工作之前,是否有针对此问题的内置解决方案。
答案 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
。后续语句将分别在2
和3
中递增。无论语句执行的顺序如何,最后只有一个文档带有"计数器"价值6
。
在Spring数据MongoDB中,mongoOperations类实例有一个名为.upsert()
的方法,该方法执行相同的基本操作。
mongoOperations.upsert(query,update,Class.class)
答案 1 :(得分:0)
对于您提出的具体问题(只保存对象),您应该使用MongoTemplate的 save()方法。有关文档,请参阅here。
您还在示例中询问了并发性,MongoDB保证了每个文档的原子性。但是你应该知道MongoDB中没有提供跨文档原子性