source

mongodb의 배열에 있는 모든 요소에서 필드 제거

nicesource 2023. 4. 29. 09:27
반응형

mongodb의 배열에 있는 모든 요소에서 필드 제거

MongoDB(2.4.5)에 아래 문서가 있습니다.

{
    "_id" : 235399,
    "casts" : {
        "crew" : [ 
            {
                "_id" : 1186343,
                "withBase" : true,
                "department" : "Directing",
                "job" : "Director",
                "name" : "Connie Rasinski"
            },
            {
                "_id" : 86342,
                "withBase" : true
            }
        ]
    },
    "likes" : 0,
    "rating" : 0,
    "rating_count" : 0,
    "release_date" : "1955-11-11"
}

casts.crew 내부의 배열 요소에서 Base file로 제거하고 싶습니다.

해봤습니다.

db.coll.update({_id:235399},{$unset: {  "casts.crew.withBase" : 1 } },false,true)

변한 것이 없습니다.

그리고 이것을 시도했습니다.

db.coll.update({_id:235399},{$unset: {  "casts.crew" : { $elemMatch: { "withBase": 1 } } } },false,true)

문서에서 전체 승무원 배열을 제거했습니다.

누군가 저에게 올바른 질문을 해주실 수 있나요?

새로운 기능을 사용하여 3.6에서 어레이의 여러 요소를 업데이트할 수 있습니다.

비슷한 것

 db.coll.update( {_id:235399}, {$unset: {"casts.crew.$[].withBase":""}} )

$[] 모든 항목 제거withBase로부터의 재산.crews배열. 배열의 모든 요소를 업데이트하는 자리 표시자 역할을 합니다.

다중 참을 사용하여 여러 문서에 영향을 미칩니다.

실망시켜서 미안하지만, 당신의 대답은.

db.coll.update({
   _id:235399,
   "casts.crew.withBase": {$exists: true}
},{
   $unset: {
      "casts.crew.$.withBase" : true
   }
},false,true)

정확하지 않습니다.실제로는 값을 제거하지만 위치 연산자의 작동 방식 때문에 하위 문서가 처음 나타나는 경우에만 값이 제거됩니다.

위치 $ 연산자가 쿼리 문서와 일치하는 첫 번째 요소에 대한 자리 표시자 역할을 합니다.

또한 사용할 수 없습니다.$unset배열에서 작동할 수 없기 때문에 (이전에 시도한 대로) 배열에서 문서에서 키를 제거하려고 하는 것입니다.또한 다음으로 제거할 수 없습니다.$pull풀은 단순히 필드가 아닌 모든 배열을 제거하기 때문입니다.

그러므로 제가 아는 한 당신은 간단한 조작자로는 이것을 할 수 없습니다.그래서 마지막 수단은 하는 것입니다.$find그리고 나서.forEach을 제외하고여기 제 대답에서 이것을 어떻게 하는지 알 수 있습니다.당신의 경우, 당신은 다른 루프를 가지고 있어야 합니다.forEach배열을 통해 반복하고 키를 삭제하는 기능.저는 당신이 그것을 수정할 수 있기를 바랍니다.안된다면 제가 도와드리겠습니다.

추신: 만약 누군가가 이것을 할 방법을 찾는다면 - 여기 산드라의 기능이 있습니다.

db.coll.find({_id:235399}).forEach( function(doc) {
  var arr = doc.casts.crew;
  var length = arr.length;
  for (var i = 0; i < length; i++) {
    delete arr[i]["withBase"];
  }
  db.coll.save(doc);
});

저는 객체를 끌어올리지 않고 이 목록을 해제하는 방법을 찾았습니다(즉, 업데이트만 하는 것). 꽤나 해킹적이지만 거대한 데이터베이스를 가지고 있다면 거래를 할 수 있을 것입니다.

db.coll.update({},{$unset: {"casts.crew.0.withBase" : 1, "casts.crew.1.withBase" : 1} }, {multi: 1})

다시 말해, 문서 목록에 얼마나 많은 개체가 있을 수 있는지 계산하고 이 경우 다음과 같이 명시적으로 숫자를 추가해야 합니다.{casts.crew.NUMBER.withBase: 1}.

또한 mongodb 개체에서 가장 긴 배열을 계산하기 위해 다음과 같은 집계를 수행할 수 있습니다.

db.coll.aggregate( [   { $unwind : "$casts.crew" },   { $group : { _id : "$_id", len : { $sum : 1 } } },   { $sort : { len : -1 } },   { $limit : 1 } ], {allowDiskUse: true} )

이것이 좋은 해결책은 아니지만 가져오는 것과 절약하는 것보다 훨씬 빠르다는 것을 강조하고 싶습니다.

언급URL : https://stackoverflow.com/questions/19945924/remove-a-field-from-all-elements-in-array-in-mongodb

반응형