以下是我的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。
我如何让它发挥作用?
答案 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比较顺序比较不同类型的值。