2016-09-28 2 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과 같은 논리 연산자를 지원하지 않는 것 같습니다. 그거야?


업데이트] (응답 @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

먼저 조건을 전달한 다음 결과를 업데이트하십시오. 당신은 당신이 한 것처럼 두 개의 분리 된 조건을 통과시킬 수 없습니다. 아래에보십시오 :

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

당신의 대답이 내 문제를 변화 시켰습니다. 질문에서 내 updation을 읽으십시오 (방금 업데이트했습니다). 고맙습니다. –

+0

@ YantaoXie 내 대답을 업데이트했습니다. 확인하십시오. – Sachin

+0

'find_one_and_update'의 프로토 타입은'find_one_and_update (filter, update, projection = 없음, sort = 없음, return_document = ReturnDocument.BEFORE, ** kwargs)'입니다. 'find_one_and_update (..., ..., projection = {new : true}, sort = function (err, user) (...})'를 의미합니까? –