복붙노트

[MONGODB] 어떻게 원자 조작으로 하나 개의 문서에 부울 필드를 전환하려면?

MONGODB

어떻게 원자 조작으로 하나 개의 문서에 부울 필드를 전환하려면?

원자 조작에 MongoDB를 한 문서의 부울 필드를 전환 할 수있는 방법이 있습니까? 말, (에서 파이썬)

cl.update({"_id": ...}, {"$toggle": {"field": 1}})

해결법

  1. ==============================

    1.지금, 나는 그것이 하나 개의 작업으로이 작업을 수행 할 수 생각하지 않습니다. 나는 그것을 위해 패치를했습니다 있지만 비트 연산자는 (http://www.mongodb.org/display/DOCS/Updating#Updating-%24bit) 아직 '$ XOR'을 필요가 없습니다.

    지금, 나는 그것이 하나 개의 작업으로이 작업을 수행 할 수 생각하지 않습니다. 나는 그것을 위해 패치를했습니다 있지만 비트 연산자는 (http://www.mongodb.org/display/DOCS/Updating#Updating-%24bit) 아직 '$ XOR'을 필요가 없습니다.

    지금은 내가 항상 '$ INC'를 사용하는 것입니다 생각 생각 해결 방법 :

    cl.update( { "_id": ...}, { '$inc' : { 'field' : 1 } } );

    그리고 대신 true 또는 false 확인, 당신은 항목이 "true"로되어 있는지 확인 할 수 있습니다 :

    cl.find( { "_id": ..., 'field' : { '$mod' : [ 2, 1 ] } );

    IE는, 당신은 심지어 "해제", 고르지 존재 "설정을"인 상태도 또는 고르지의 여부를 확인하기 위해 모듈로 연산자를 사용하여. 당신이 oppposite 동작을 실행하려면, 다음 사용 (즉, 플래그가 설정되지 않은 모든 항목을 찾을 수) [2, 0];

  2. ==============================

    2.서버 4362 문제는 실제로 지금 해결 당신은 $ 비트 업데이트 연산자를 사용할 수 있습니다. 그래서 그것의 XOR 인수와 함께 이제 원자 행동으로이 작업을 수행 할 수 있습니다 :

    서버 4362 문제는 실제로 지금 해결 당신은 $ 비트 업데이트 연산자를 사용할 수 있습니다. 그래서 그것의 XOR 인수와 함께 이제 원자 행동으로이 작업을 수행 할 수 있습니다 :

    cl.findOneAndUpdate( 
      { "_id": ...}, 
      { 
         "$bit": { 
             "field": { "xor": NumberInt(1) } 
         } 
      },
      { "returnNewDocument": true, "upsert": true }
    );
    

    따라서 한 필드의 값이 0 또는 1 다음 비트의 "폴더"로 유지 될 때 그 현재 값은 변형시에 있었는지의 대향하게됩니다.

    .findOneAndUpdate ()는 필요하지만 결과 값이 모든 수정에 다른 것을 보여주는 단지 방법이되지 않습니다.

  3. from https://stackoverflow.com/questions/9459789/how-to-toggle-a-boolean-field-in-one-document-with-atomic-operation by cc-by-sa and MIT license