복붙노트

[MONGODB] 하나의 문에서 여러 몽고 업데이트 연산자?

MONGODB

하나의 문에서 여러 몽고 업데이트 연산자?

나는 $ pushAll 하나의 문에서 $ INC는 결합 할 수 있습니까?

전에이 잘 작동 결합 :

db.createCollection("test");
db.test.insert({"name" : "albert", "bugs" : []});

db.test.update({"name":"albert"}, 
    {"$pushAll" : {"bugs" : [{"name":"bug1", "count":1}]}});

db.test.update({"name":"albert"}, 
    {"$inc" : {"bugs.0.count" : 1}});

db.test.update({"name":"albert"}, 
    {"$pushAll" : {"bugs" : [{"name":"bug2", "count":1}]}});

하지만 난 이런 식으로 결합 할 때 :

db.createCollection("test");
db.test.insert({"name" : "albert", "bugs" : []});

db.test.update({"name":"albert"}, 
    {"$pushAll" : {"bugs" : [{"name":"bug1", "count":1}]}});

db.test.update({"name":"albert"}, 
    {
       "$pushAll" : {"bugs" : [{"name":"bug2", "count":1}]}, 
       "$inc" : {"bugs.0.count" : 1}
    }
);

이 오류가 발생합니다 :

have conflicting mods in update

나는이 작업을 수행 할 수 있을까, 또한, 난 그냥 pushAll 및 INC 이상을 결합 상상,하지만 난이 지원되지 않거나 있지 않다 있는지 여부?

나는 배열의 다른 요소에 여러 $의 INC를했는데, 그것은 제대로 수행하지 않는 있지만 (왜 작동이 doensnt 잘 작동하고 어떤 일을 명확히하기 위해 아래의 대답에서 인용. 두 필드를 증가하는 올바른 방법은 그대로 다음> dB. test.update ({ "이름": "알버트"}, { "$ INC": { "bugs.0.count": 1, "bugs.1.count": 1}}) :

db.test.update({"name":"albert"}, 
  {
    "$inc" : {"bugs.0.count" : 1}, 
    "$inc" : {"bugs.1.count" : 1}
  }
);

그리고 $ 세트와 배열도 작동의 다른 요소에 $ INC의 조합 :

db.test.update({"name":"albert"}, 
  {
    "$set" : {"bugs.0.test" : {"name" : "haha"}}, 
    "$inc" : {"bugs.0.count" : 1}, 
    "$inc" : {"bugs.1.count" : 1}
  }
);

그러나 $ 푸시 또는 $ pushAll와 이들의 결합, 모든 오류를 이동합니다.

그래서, 내 현재의 결론은, 그것은 문제입니다 동일한 어레이 내에서 여러 요소에 여러 작업에 대한 것이 아니라 배열을 변경할 수 있습니다 $ 푸시 또는 $ pushAll으로 이러한 작업을 결합하는 것은 문제이다.

해결법

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

    1.여러 업데이트 한 해당 업데이트가 충돌하지 않는 (따라서 오류 "업데이트에서 충돌 개조가"), 같은 문서에 수행 될 수있다.

    여러 업데이트 한 해당 업데이트가 충돌하지 않는 (따라서 오류 "업데이트에서 충돌 개조가"), 같은 문서에 수행 될 수있다.

    { "버그": [{ "이름": "bug1", "계산": 1}]}와 "$ INC": { "bugs.0.count": 1} 모두를 시도하는 "$ 푸시"때문에 문서 (즉, "버그"배열), 충돌들은 동일한 부분을 수정.

    각 문서의 다른 부분이 영향을 미치는 경우 여러 업데이트가 결합 될 수있다 :

    예를 들어 :

    > db.test.drop()
    true
    > db.test.save({ "_id" : 1, "name" : "albert", "bugs" : [ ] })
    > db.test.update({"name":"albert"}, {"$pushAll" : {"bugs" : [{"name":"bug1", "count":1}]}, "$inc" : {"increment" : 1}, $set:{"note":"Here is another field."}})
    > db.test.find()
    { "_id" : 1, "bugs" : [ { "name" : "bug1", "count" : 1 } ], "increment" : 1, "name" : "albert", "note" : "Here is another field." }
    > 
    

    이 업데이트는 세 가지 다른 작업 ($ pushAll, $ INC, 및 $ 설정)에 들어있는 각 작업 문서의 다른 부분에 영향을하기 때문에, 성공적으로 완료 할 수 있었다.

    나는 이것이 당신이해야 할 바라고 정확히하지 실현, 그러나 희망은 어떻게 업데이트 작업의 이해보다 약간의를 제공 할 것입니다, 아마 당신의 업데이트 및 / 또는 문서가 그 기능을 수행하기 위해 재구성 될 수있는 방법을 몇 가지 아이디어를 제공하여 응용 프로그램이 필요합니다. 행운을 빕니다.

  2. from https://stackoverflow.com/questions/9823140/multiple-mongo-update-operator-in-a-single-statement by cc-by-sa and MIT license