mongodb findOneAndUpdate仅在满足某个条件时才会出现

时间:2018-03-16 17:06:55

标签: mongodb

以下是我的mongo db条目。

my-mongo-set:PRIMARY> db.stat_collection.find({name : /s/})
{ "_id" : ObjectId("5aabf231a167b3808302b138"), "name" : "shankarmr", "email" : "abc@xyz", "rating" : 9901 }
{ "_id" : ObjectId("5aabf23da167b3808302b139"), "name" : "shankar", "email" : "abc1@xyz1", "rating" : 10011 }
{ "_id" : ObjectId("5aabf2b5a167b3808302b13a"), "name" : "shankar1", "email" : "abc2@xyz2", "rating" : 10 }
{ "_id" : ObjectId("5aabf2c2a167b3808302b13b"), "name" : "shankar2", "email" : "abc3@xyz3", "rating" : 100 }

现在我想根据名称找到一个条目,但只有在某个条件成立时才更新字段。

我尝试了以下声明,但它在第二次引用$ rating时给出了错误。

db.stat_collection.findOneAndUpdate({name: "shankar"}, {$set : {rating : {$cond : [ {$lt : [ "$rating", 100]}, 100, $rating]}}, $setOnInsert: fullObject}, {upsert : true} )

所以在我的情况下,它不应该更新第二份文件的评级,因为评级不低于100.但对于第三份文件,评级应该更新为100。

我如何让它发挥作用?

2 个答案:

答案 0 :(得分:0)

您应该将所有条件放在更新的查询部分中:

db.stat_collections.findOneAndUpdate(
  { name: "Shankar", rating: { $lt: 100 } },
  $set : { rating: 100 },
);

"如果名称为Shankar且评级小于100,则将评级设置为100。"就是上面。

答案 1 :(得分:0)

$max是您正在寻找的运营商,请尝试:

db.stat_collection.findOneAndUpdate( { name: "shankar1"}, { $max: { rating: 100 } }, { returnNewDocument: true } )

您将获得旧值(如果大于100)或修改文档并设置100

根据文件:

  

如果指定的值大于字段的当前值,$ max运算符会将字段的值更新为指定值。 $ max运算符可以使用BSON比较顺序比较不同类型的值。