복붙노트

[MONGODB] MongoDB를 배열에있는 모든 요소의 필드 삭제 [중복]

MONGODB

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 내부 배열 요소에서 withBase 필드를 제거 할 ..

나는이 시도

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)

이는 문서의 전체 승무원 어레이를 제거 하였다.

누군가가 나에게 올바른 쿼리를 제공시겠습니까?

해결법

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

    1.죄송하지만 답변을 실망

    죄송하지만 답변을 실망

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

    올바르지 않습니다. 방식 때문에 위치 연산자 작품, 실제로는 값을 제거하지만, 오직 하위의 제에서 발생 :

    (이전에 시도로) (당신은 기본적으로 배열에서 문서에서 키를 제거하기 위해 노력하고있다)가 배열에 대한 작업을 할 수 없기 때문에 당신은 또한 $ 해제를 사용할 수 없습니다. 풀은 모든 배열, 그것의 단지 필드를 제거하기 때문에 또한, $ 풀로 제거 할 수 없습니다.

    따라서 내가 아는 당신은 간단한 조작으로이 작업을 수행 할 수 없습니다. 최후의 수단은 $을하고 그래서 찾아 저장과 다음 대해 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);
    });
    
  2. ==============================

    2.당신은 3.6 배열의 여러 요소를 업데이트 할 새 위치 식별자를 사용할 수 있습니다.

    당신은 3.6 배열의 여러 요소를 업데이트 할 새 위치 식별자를 사용할 수 있습니다.

    같은 뭔가

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

    $ []를 승무원 어레이에서 모든 withBase 속성을 제거한다. 이는 어레이 내의 모든 요소를 ​​갱신하는 자리로서 작용한다.

    를 사용하여 다중 사실은 여러 문서에 영향을 미칠 수 있습니다.

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

    3.나는 물체를 (단지 업데이 트를하고, 의미), 꽤 hackish입니다하지만 당신은 거대한 데이터베이스가있는 경우는 거래를하게됩니다 끌어하지 않고이 목록을 설정 해제하는 방법을 발견 :

    나는 물체를 (단지 업데이 트를하고, 의미), 꽤 hackish입니다하지만 당신은 거대한 데이터베이스가있는 경우는 거래를하게됩니다 끌어하지 않고이 목록을 설정 해제하는 방법을 발견 :

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

    즉,이 문서 목록의해야하며 {: 1 casts.crew.NUMBER.withBase}이 경우, 명시 적으로 그 숫자를 추가 할 수 있습니다 얼마나 많은 개체를 계산해야합니다.

    또한, MongoDB의 오브젝트에서 가장 긴 배열을 계산, 집계,이 같은 일을 수행 할 수 있습니다 :

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

    그냥이 꽤 솔루션이 아니라 빠르게 가져 와서 저장하는 것보다 방법임을 강조하고 싶다.

  4. from https://stackoverflow.com/questions/19945924/remove-a-field-from-all-elements-in-array-in-mongodb by cc-by-sa and MIT license