仅当文档在MongoDB中更新时才更新字段

时间:2019-09-17 21:17:39

标签: mongodb

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

例如,如MongoDB documentation所示。

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

仅在文档更新时,我还要设置一个lastUpdatedTimestamp。我不能只执行$set,因为这将始终更改上次更新的时间戳。 MongoDB中是否有一个很好的机制来仅在文档更新的情况下设置另一个值?与$setOnInsert类似,但有任何更新。


如果这里没有什么好的方法?现在,我正在考虑可以进行常规查找。然后进行局部比较。如果新值大于旧值,则更新很有可能会更新文档。因此,我只将$set包括在lastUpdatedTimestamp中。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

据我所见,你想。仅当您的highScore可以更新时才更新文档。

仅文档的分数低于新分数,它将使用score字段和lastUpdatedTimestamp进行更新

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

这样做

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

或设置修改时间,例如

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