MongoDB是否支持更新表达式中的逻辑运算符?

时间:2016-09-28 08:06:06

标签: 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'}}]}

我得到例外OperationFailure: Unknown modifier: $and。似乎MongoDB在更新表达式中不支持$and之类的逻辑运算符。是吗?

更新(回答@chridam):

上面的代码只是一个想要展示情况的示例:要查找具有指定uid的用户文档,请将其设置为user_id,并仅在以下情况下设置device_id device_id不等于某个值,例如历史数值。

1 个答案:

答案 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'})
}