복붙노트

[MONGODB] 몽고와 동시에 풀과 addtoset

MONGODB

몽고와 동시에 풀과 addtoset

나는 요소가이 단순화 할 수있는 컬렉션이 있습니다 :

태그 {[1, 5, 8}

곳이 배열에 적어도 하나 개의 요소가 될 것이며, 그들 모두는 달라야합니다. 나는 서로에 대한 하나 개의 태그를 대체 할 내가 문제가되지 않을 것이라고 생각했다. 그래서 나는 다음과 같은 쿼리를 함께했다 :

db.colll.update({
  tags : 1
},{
  $pull: { tags: 1 },
  $addToSet: { tags: 2 }
}, {
  multi: true
})

쿨, 그래서 내가하지 않아도 태그 (1)가 모든 요소를 ​​발견 할 것이다, 그것을 제거하고 이미 거기 경우 다른 (2)를 추가합니다. 문제는 그 오류를 얻을 수 있습니다 :

기본적으로 어떤 I 동시에 풀과 addtoset을 할 수 없음을 의미합니다. 나는이 작업을 수행 할 수있는 다른 방법이 있습니까?

물론 나는 모든 요소 ID를 기억하고 태그를 제거하고 별도의 쿼리에 추가 할 수 있지만이 소리 좋은 작업을 수행 할 수 없습니다.

해결법

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

    1.이 오류는 거의 동일한 업데이트 작업에 동일한 "경로"의 두 가지 행동 할 수 없기 때문에 그 의미 것입니다. 두 사업자는 당신이 그들이 생각하는대로 순차적으로 처리하지 않습니다 사용하고 있습니다.

    이 오류는 거의 동일한 업데이트 작업에 동일한 "경로"의 두 가지 행동 할 수 없기 때문에 그 의미 것입니다. 두 사업자는 당신이 그들이 생각하는대로 순차적으로 처리하지 않습니다 사용하고 있습니다.

    당신은 아마도 "대량"운영 API 또는 그러나 "대량"업데이트의 다른 형태로 얻을 수있는 "연속"으로이 작업을 수행 할 수 있습니다. 물론, 또한 반대의 이유 이내 :

    var bulk = db.coll.initializeOrderedBulkOp();
    bulk.find({ "tags": 1 }).updateOne({ "$addToSet": { "tags":  2 } });
    bulk.find({ "tags": 1 }).updateOne({ "$pull": { "tags": 1 } });
    
    bulk.execute();
    

    다른 아무것도 수정하려고하지 않습니다, 그러나 가까이 현재 얻을 것 같은 것을 보장하지.

    또한 여러 문서와 원시 "갱신"명령을 참조하십시오.

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

    2.당신은 제거하고 동시에 추가하는 경우, 당신은 '지도'를 모델링하는 대신 '설정'을 할 수있다. 그렇다면, 객체 배열보다 일 수있다.

    당신은 제거하고 동시에 추가하는 경우, 당신은 '지도'를 모델링하는 대신 '설정'을 할 수있다. 그렇다면, 객체 배열보다 일 수있다.

    대신 배열로서 데이터 :

    { _id: 'myobjectwithdata',
      data: [{ id: 'data1', important: 'stuff'},
             { id: 'data2', important: 'more'}]
    }
    

    데이터를 객체로 사용

    { _id: 'myobjectwithdata',
      data: { data1: { important: 'stuff'},
              data2: { important: 'more'} }
    }
    

    한 - 명령 업데이트는 다음입니다 :

    db.coll.update(
      'myobjectwithdata', 
      { $set: { 'data.data1': { important: 'treasure' } }
    );
    

    여기와 여기에 일이 답변에 대한 하드 두뇌 작업입니다.

  3. ==============================

    3.경우 다른 확인이 답변에 배열에서 하나 개의 값을 대체 할 필요가 :

    경우 다른 확인이 답변에 배열에서 하나 개의 값을 대체 할 필요가 :

    arrayFilters을 사용하여 배열 값을 바꾸기

  4. from https://stackoverflow.com/questions/24300148/pull-and-addtoset-at-the-same-time-with-mongo by cc-by-sa and MIT license