【问题标题】:Saving document the first time with MongoTemplate第一次使用 MongoTemplate 保存文档
【发布时间】:2015-03-03 14:55:35
【问题描述】:

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

例子:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 郑重声明,.save() 实际上是大多数语言驱动程序中实现的基本驱动程序功能,并由各种更高级别的扩展(例如 SpringData MongoDB)采用以与通用 API 保持一致。它是一种“非常有限”的“upsert”形式,因为不支持诸如$inc$set$push 等的“更新操作符”。它只是完全替换了一个对象。这是最优代码几乎不应该做的事情。
    【解决方案2】:

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

    就像任何.update() 方法的调用一样,这需要两个基本参数,包括“查询”对象和“更新”对象。 “更新”对象使用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 data MongoDB 中,mongoOperations 类实例有一个名为 .upsert() 的方法,它执行相同的基本操作。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-07
      • 2016-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-21
      • 2014-06-28
      • 2012-09-20
      相关资源
      最近更新 更多