例如,我的代码位于
之下b = c.test.users.find_one_and_update(
{'uid': u'52ae5c7a48bd9ffb716bf4f774954d20'},
{'$set': {'user_id': '111'},
'$and': [{'device_id': {'$ne': u'c09b46863f953bec1d5c0a1a'}},
{'$set': {'device_id': 'abc'}}]}
我得到例外OperationFailure: Unknown modifier: $and
。似乎MongoDB在更新表达式中不支持$and
之类的逻辑运算符。是吗?
更新(回答@chridam):
上面的代码只是一个想要展示情况的示例:要查找具有指定uid
的用户文档,请将其设置为user_id
,并仅在以下情况下设置device_id
device_id
不等于某个值,例如历史数值。
答案 0 :(得分:1)
首先传递条件然后更新结果。你无法像你所做的那样通过两个独立的条件。请尝试以下:
c.test.users.find_one_and_update(
{'uid': u'52ae5c7a48bd9ffb716bf4f774954d20'}},
{'$set': {'user_id': '111', 'device_id': 'abc'}}, {new: true}, function(err, user){
if(err) return next(err);
if(user.device_id !== 'c09b46863f953bec1d5c0a1a'){
user.device_id = 'abc';
user.save();
}
})
<强>更新强>
db.example.find_one_and_update(
{'uid': u'52ae5c7a48bd9ffb716bf4f774954d20'}},
{'$set': {'user_id': '111', 'device_id': 'abc'}},
return_document=ReturnDocument.AFTER)
获得此结果后,您可以更改返回的对象,然后保存它。
P.S。:由于save()在3.0中已弃用,因此如果您使用的是&gt; 3.0版本,则使用replace_one();
<强>&LT; 3.0 强>
var newUser = db.example.find_one_and_update(
{'uid': u'52ae5c7a48bd9ffb716bf4f774954d20'}},
{'$set': {'user_id': '111', 'device_id': 'abc'}},
return_document=ReturnDocument.AFTER);
if(newUser.device_id !== 'c09b46863f953bec1d5c0a1a'){
newUser.device_id = 'abc';
db.example.save(newUser);
}
<强>&GT = 3.0 强>
var newUser = db.example.find_one_and_update(
{'uid': u'52ae5c7a48bd9ffb716bf4f774954d20'},
{'$set': {'user_id': '111', 'device_id': 'abc'}},
return_document=ReturnDocument.AFTER);
if(newUser.device_id !== 'c09b46863f953bec1d5c0a1a'){
db.example.replace_one({'uid': u'52ae5c7a48bd9ffb716bf4f774954d20'}, {'device_id': 'abc'})
}