1

例如,我的代码如下

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不等于某个值时设置它,例如历史值。

4

1 回答 1

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)

获得此结果后,您可以更改返回的对象,然后保存它。

PS:由于 save() 在 3.0 中已弃用,因此如果您使用 >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);
}

>=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'})
}
于 2016-09-28T08:20:09.140 回答