[mongodb] MongoDB 문서에서 필드를 완전히 제거하는 방법은 무엇입니까?

{ 
    name: 'book',
    tags: {
        words: ['abc','123'],
        lat: 33,
        long: 22
    }
}

이것이 문서라고 가정하십시오. words이 컬렉션의 모든 문서에서 ” “를 완전히 제거하려면 어떻게합니까 ? 모든 문서에 ” words” 가없는 것을 원합니다 .

 { 
     name: 'book',
     tags: {
         lat: 33,
         long: 22
     }
}



답변

다음을 시도하십시오 : 컬렉션이 ‘예제’인 경우

db.example.update({}, {$unset: {words:1}}, false, true);

이것을 참조하십시오 :

http://www.mongodb.org/display/DOCS/Updating#Updating-%24unset

업데이트 :

위의 링크는 더 이상 ‘$ unset’을 다루지 않습니다. {multi: true}컬렉션의 모든 문서에서이 필드를 제거 하려면 추가 해야합니다. 그렇지 않으면 일치하는 첫 번째 문서에서만 제거됩니다. 업데이트 된 설명서는 다음을 참조하십시오.

https://docs.mongodb.com/manual/reference/operator/update/unset/

예:

db.example.update({}, {$unset: {words:1}} , {multi: true});


답변

처음에는 질문에 현상금이있는 이유를 얻지 못했습니다 (질문에 좋은 대답이 있고 추가 할 것이 없다고 생각했습니다). 그러나 15 번 수락하고 공표 한 답변이 실제로 잘못되었음을 알았습니다!

예, $unsetoperator 를 사용해야 하지만이 설정을 해제하면 컬렉션의 문서에 존재하지 않는 단어 키가 제거됩니다. 따라서 기본적으로 아무것도하지 않습니다.

따라서 Mongo에게 문서 태그를 찾은 다음 점 표기법을 사용하는 단어를 보도록 지시해야합니다 . 올바른 쿼리입니다.

db.example.update(
  {},
  { $unset: {'tags.words':1}},
  false, true
)

완성을 위해 다른 방법을 언급 할 것입니다. 이 방법은 훨씬 나쁘지만이 방법을 사용하면이 문서의 다른 필드를 기반으로하는 사용자 정의 코드로 필드를 변경할 수 있습니다.


답변

db.example.updateMany({},{"$unset":{"tags.words":1}})

이를 사용하여 여러 문서를 업데이트 할 수도 있습니다.


답변

MongoDB에서 필드를 제거하거나 삭제하려면

  • 단일 레코드

    db.getCollection('userData').update({}, {$unset: {pi: 1}})
  • 멀티 레코드

    db.getCollection('userData').update({}, {$unset: {pi: 1}}, {multi: true})

답변

이와 비슷한 작업을 시도했지만 대신 포함 된 문서에서 열을 제거했습니다. 해결책을 찾는 데 시간이 걸렸으며 이것이 처음 접한 게시물이므로 다른 사람이 똑같이하려고하면 여기에 게시 할 것이라고 생각했습니다.

따라서 데이터가 다음과 같다고 가정 해 보겠습니다.

{
  name: 'book',
  tags: [
    {
      words: ['abc','123'],
      lat: 33,
      long: 22
    }, {
      words: ['def','456'],
      lat: 44,
      long: 33
    }
  ]
}

words포함 된 문서에서 열을 제거하려면 다음 과 같이하십시오.

db.example.update(
  {'tags': {'$exists': true}},
  { $unset: {'tags.$[].words': 1}},
  {multi: true}
)

또는 updateMany

db.example.updateMany(
  {'tags': {'$exists': true}},
  { $unset: {'tags.$[].words': 1}}
)

$unset값이 존재하는 경우에만 편집합니다하지만 (경우 확인 실 거예요 안전한 탐색을하지 않을 것이다 tags가 포함 된 문서에 필요한 존재 있도록 먼저 존재).

버전 3.6에 도입 된 모든 위치 연산자 ( $[])를 사용합니다.


답변

기본적으로 update () 메소드는 단일 문서를 업데이트합니다. 쿼리 기준과 일치하는 모든 문서를 업데이트하려면 다중 매개 변수를 설정하십시오.

버전 3.6으로 변경되었습니다. 구문 :

db.collection.update(
   <query>,
   <update>,
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>,
     collation: <document>,
     arrayFilters: [ <filterdocument1>, ... ]
   }
)

예 :

db.getCollection('products').update({},{$unset: {translate:1, qordoba_translation_version:1}}, {multi: true})

귀하의 예에서 :

db.getCollection('products').update({},{$unset: {'tags.words' :1}},  {multi: true})


답변

시작 Mongo 4.2하면서 약간 다른 구문을 사용할 수도 있습니다.

// { name: "book", tags: { words: ["abc", "123"], lat: 33, long: 22 } }
db.collection.update({}, [{ $unset: ["tags.words"] }], { many: true })
// { name: "book", tags: { lat: 33, long: 22 } }

갱신 또한 통합 파이프 라인을 받아 들일 수 방법은 (집계 파이프 라인의 사용을 의미 제곱 브래킷을 참고).

이는 $unset사용되는 연산자가 집계 쿼리 ( “query”에 반대 )이며 구문은 필드 배열을 사용함을 의미 합니다.