먼저 조건을 전달한 다음 결과를 업데이트하십시오. 당신은 당신이 한 것처럼 두 개의 분리 된 조건을 통과시킬 수 없습니다. 아래에보십시오 :
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)
당신이 반환 된 개체에 변경 한 다음 저장할 수 있습니다이 결과를 얻는 후.
추신 : 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 제 질문을 정리하여 제 질문을 정리했습니다. 고맙습니다. –