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