最初に条件を渡してから結果を更新します。 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'})
}
のみ委任[**更新演算子**](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
文書スキーマと期待される結果を書くことができますか? – TomG
@chridam私は自分の質問をきれいにするために私の質問を更新しました。ありがとうございました。 –