MongoDB在更新表达式中是否支持逻辑运算符?
例如,我的代码如下MongoDB在更新表达式中是否支持逻辑运算符?,mongodb,pymongo,pymongo-3.x,Mongodb,Pymongo,Pymongo 3.x,例如,我的代码如下 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'
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'}}]}
我得到一个异常操作失败:未知修饰符:$和。MongoDB似乎不支持更新表达式中的逻辑运算符,如$和
。是吗
更新(答案@chridam):
上面的代码只是一个示例,它想显示一种情况:要查找具有指定的uid
的用户文档,请将其设置为user\u id
,并且仅当设备id
不等于某个值(例如历史值)时才设置设备id
。首先通过条件,然后更新结果。你不能像以前那样通过两个单独的条件。请尝试以下内容:
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)
获得此结果后,您可以在返回的对象中进行更改,然后保存它
注意:3.0中不推荐使用As save(),因此如果您使用的是>3.0版本,则使用replace_one()
<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);
}
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'})
}
=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);
}
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'})
}
只能使用委托的,否则MongoDB将投诉并抛出错误。为什么你不能把它作为一个原子更新来运行呢,为什么要在不应该包含逻辑运算符的地方包含逻辑运算符?您可以编写文档架构和预期结果吗?@chridam我已经更新了我的问题以清除我的问题。谢谢。你的回答改变了我的问题。请阅读问题中我的更新(我刚刚更新)。谢谢。我发现find\u one\u and\u update
的原型是find\u one\u and\u update(filter,update,projection=None,sort=None,return\u document=ReturnDocument.BEFORE,**kwargs)
。你的意思是find\u one\u and\u update(…,…,projection={new:true},sort=function(err,user){…})
?我指的是find\u one\u and\u update
。