2016-09-28 9 views
1

は例えば、私のコードはMongoDBは更新式で論理演算子をサポートしていますか?

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のような論理演算子をサポートしていないようです。それは?


UPDATED(回答@chridam):

上記のコードは、状況を表示したいだけの例である:uid指定を持つユーザドキュメントを見つけるためには、それはuser_idだ設定、およびdevice_idを設定しますdevice_idがヒストリアン値などの一部の値と等しくない場合に限ります。

+1

のみ委任[**更新演算子**](https://docs.mongodb.com/manual/ reference/operator/update /#id1)を使用することができますが、それ以外の場合はMongoDBがエラーになります。なぜ、これを原子的な更新として実行できないのですか?{'uid':u'52ae5c7a48bd9ffb716bf4f774954d20 '、' device_id ':{' $ ne ':u'c09b46863f953bec1d5c0a1a'}}、{'$ set':{'user_id' : '111'、 'device_id': 'abc'}} 'なぜ、論理演算子をどこに含めてはならないのでしょうか? – chridam

+0

文書スキーマと期待される結果を書くことができますか? – TomG

+1

@chridam私は自分の質問をきれいにするために私の質問を更新しました。ありがとうございました。 –

答えて

1

最初に条件を渡してから結果を更新します。 2つの別々の条件を渡すことはできません。以下試してみてください:

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(); 
} 
}) 

UPDATE:

db.example.find_one_and_update(
    {'uid': u'52ae5c7a48bd9ffb716bf4f774954d20'}}, 
    {'$set': {'user_id': '111', 'device_id': 'abc'}}, 
    return_document=ReturnDocument.AFTER) 

あなたが返されるオブジェクトに変更し、それを保存することができ、この結果を取得した後。

P.S .: 3.0で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); 
} 

> = 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'}) 
} 
+0

あなたの答えが私の問題を変えました。質問の私の更新を読んでください(私はちょうど更新しました)。ありがとうございました。 –

+0

@ YantaoXie私は自分の答えを更新しました。 – Sachin

+0

'find_one_and_update'のプロトタイプは' find_one_and_update(filter、update、projection = None、sort = None、return_document = ReturnDocument.BEFORE、** kwargs) 'です。 'find_one_and_update(...、...、projection = {new:true}、sort = function(err、user){...})'を意味しますか? –