【问题标题】:Update field only if document updated in MongoDB仅当文档在 MongoDB 中更新时才更新字段
【发布时间】:2019-09-18 10:50:45
【问题描述】:

我正在调用findAndModify() 使用$max 函数将字段的值设置为最大值。

MongoDB documentation所示。

db.scores.update( { _id: 1 }, { $max: { highScore: 950 } } )

我还想在文档更新时设置lastUpdatedTimestamp。我不能只执行$set,因为这总是会更改最后更新的时间戳。 MongoDB 中是否有一个很好的机制来设置另一个值只有在文档更新时?类似于 $setOnInsert 的东西,但可以更新。


如果这里没有什么好方法?现在我想我可以进行常规查找。然后进行局部比较。如果新值大于旧值,则更新很有可能会更新文档。所以我只为lastUpdatedTimestamp 包含$set

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    您可以先进行查询以查找 highScore 小于您输入值的记录,然后进行更新。这只会在更新记录时设置 lastUpdatedTimestamp。

    db.scores.findAndModify({
       query: { highScore: { $lt: 950 } },
       update: { $set: { "highScore" : 950, "lastUpdatedTimestamp" : new Date() } },
    })
    

    【讨论】:

      【解决方案2】:

      我看到你想要。仅当您的 highScore 可以更新时才更新您的文档。

      只有文档的分数低于新的分数值,它将更新为score字段和lastUpdatedTimestamp

      最好的方法是将你的新分数放入过滤器中以找到与旧分数匹配的文档

      这样做

      db.scores.update(
      {_id :4,highScore:{$lt:900}},
      {$set:{highScore:900},
      $currentDate: { lastModified: true }})
      

      或者像设置修改时间

      {$set:{highScore:900 ,lastupdatetime: new_time},
      

      【讨论】:

      • 我试过了。但是,我正在尝试使用findAndModify。因此,如果我包含条件并且当前 highScore 大于可能的更新值,Mongo 将不会返回任何现有文档,因为它没有找到它。
      • findAndModify() 将只返回可以在您的查询中修改的文档。你想返回什么。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-14
      • 1970-01-01
      • 2014-09-09
      • 2022-09-25
      • 2017-05-28
      • 1970-01-01
      • 2015-07-30
      相关资源
      最近更新 更多