programing

몽고로 풀링과 세트 추가를 동시에 합니다.

telecom 2023. 6. 24. 08:46
반응형

몽고로 풀링과 세트 추가를 동시에 합니다.

다음과 같이 단순화할 수 있는 요소를 수집했습니다.

{tags : [1, 5, 8]}

배열에 하나 이상의 요소가 있고 모든 요소가 달라야 합니다.저는 한 태그를 다른 태그로 대체하고 싶고 문제가 없을 것이라고 생각했습니다.그래서 저는 다음과 같은 질문을 생각해냈습니다.

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

좋습니다. 그래서 그것은 제가 필요로 하지 않는 태그가 있는 모든 요소를 찾을 것입니다. (1) 그것을 제거하고 만약 그것이 아직 없다면 다른 (2)를 추가할 것입니다.문제는 오류가 발생한다는 것입니다.

"'태그'와 '태그'를 동시에 업데이트할 수 없습니다."

즉, 풀과 세트에 추가를 동시에 할 수 없다는 것입니다.제가 이것을 할 수 있는 다른 방법이 있나요?

물론 저는 요소의 ID를 모두 외운 다음 태그를 제거하고 별도의 쿼리를 추가할 수 있지만, 이것은 좋게 들리지 않습니다.

이 오류는 동일한 업데이트 작업에서 동일한 "경로"의 두 가지 작업에 대해 작업할 수 없기 때문에 거의 의미합니다.사용 중인 두 연산자는 생각처럼 순차적으로 처리되지 않습니다.

그러나 "대량" 운영 API 또는 다른 형태의 "대량" 업데이트를 통해 가능한 한 "순차적"으로 이 작업을 수행할 수 있습니다.당연한 이치 내에서, 그리고 역으로:

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

bulk.execute();

다른 어떤 것도 수정하려고 시도하지 않는다는 보장은 없지만, 현재 얻을 수 있는 것만큼 가깝습니다.

여러 문서가 있는 원시 "업데이트" 명령도 참조하십시오.

제거 및 추가를 동시에 수행하는 경우 '세트' 대신 '맵'을 모델링하는 것일 수 있습니다.그렇다면 개체가 배열보다 작업량이 적을 수 있습니다.

데이터를 배열로 사용하는 대신:

{ _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' } }
);

이 대답을 위해 열심히 일하는 것은 여기와 여기에서 이루어졌습니다.

시작 위치Mongo 4.4집계 연산자는 사용자 정의 Javascript 함수를 적용하여 MongoDB 쿼리 언어에서 지원되지 않는 동작을 구현할 수 있습니다.

그리고 그것에 대한 개선과 함께.Mongo 4.2집계 파이프라인을 수용하여 자체 값을 기반으로 필드를 업데이트할 수 있습니다.

언어가 쉽게 허용하지 않는 방식으로 배열을 조작하고 업데이트할 수 있습니다.

// { "tags" : [ 1, 5, 8 ] }
db.collection.updateMany(
  { tags: 1 },
  [{ $set:
    { "tags":
      { $function: {
          body: function(tags) { tags.push(2); return tags.filter(x => x != 1); },
          args: ["$tags"],
          lang: "js"
      }}
    }
  }]
)
// { "tags" : [ 5, 8, 2 ] }

$function세 가지 매개 변수를 사용합니다.

  • body매개 변수가 수정할 배열인 적용할 함수입니다. 여서의함다같구이성다니됩음과수는기▁in로 구성되어 .push2 및 배열및에filter1.
  • args여기에는 레코드의 필드가 포함되어 있습니다.body함수는 매개 변수로 사용됩니다.저희 같은 경우에는."$tag".
  • lang그것이 그 언어입니다.body함수가 작성되었습니다..js현재 사용할 수 있습니다.

배열의 한 값을 다른 값으로 바꿔야 하는 경우 다음 답변을 확인합니다.

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

언급URL : https://stackoverflow.com/questions/24300148/pull-and-addtoset-at-the-same-time-with-mongo

반응형