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


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

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

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

답변:


531

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

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});


1
더 이상이 페이지 어딘가에 "Nic Cottrell"의 코멘트가 없습니다 :)
Dan Dascalescu

6
때문에, 뭔가를 누락 또는 8+ 년 동안이되고 잘못이 있습니까 tags.words해야 $unset하지 words? 살바도르 달리의 답변도 참조하십시오.
Dan Dascalescu

1
당신은 또한 사용할 수있는 updateMany대신에 {multi:true}, 즉db.example.updateMany({},{"$unset":{words:""}})

158

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

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

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

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

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


2
이에 추가하여, tags가 배열 인 경우 다음과 같습니다. db.example.update ({}, {$ unset : { 'tags. $ []. words': 1}}, false, true)
Manan 샤

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

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


2
나는 false, true마지막 두 개의 인수로 전달하는 것보다 더 명확하다는 것을 update()
Kip

17

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

  • 단일 레코드

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

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

2

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

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

{ 
  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에 도입 된 모든 위치 연산자 ( $[])를 사용합니다.


1

기본적으로 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})

1

시작 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"에 반대 )이며 구문은 필드 배열을 사용함을 의미 합니다.



0

몽고 매퍼에게는

  • 문서 : 차단
  • 제거 할 필드 : shutoff_type

Shutoff.collection.update( {}, { '$unset' => { 'shutoff_type': 1 } }, :multi => true )


0

MongoEngine을 사용하여 필드를 제거하는 방법을 찾을 때이 페이지를 계속 찾았으므로 MongoEngine 방법을 여기에 게시하는 것이 도움이 될 것입니다.

Example.objects.all().update(unset__tags__words=1)

-2

{이름 : 'book', 태그 : {단어 : [ 'abc', '123'], 위도 : 33, 길이 : 22}}

답변 :

db.tablename.remove ({ 'tags.words': [ 'abc', '123']})


-3

"단어"가 있는지 확인한 후 문서에서 제거

    db.users.update({"tags.words" :{$exists: true}},
                                           {$unset:{"tags.words":1}},false,true);

true는 일치하는 경우 여러 문서를 업데이트 함을 나타냅니다.


존재 여부를 확인할 필요가 없습니다. 문서 상태 가 "필드가 존재하지 않는 경우, 아무것도 (즉 어떤 동작을)하지 않습니다 해제 후 $."
Dan Dascalescu

-4

3.4에서 프로젝트를 사용하여 집계 에서이 작업을 수행 할 수도 있습니다

{$ project : { "tags.words": 0}}


-7

패키지를 참조하고 다양한 "키"를 제거하려면 다음을 시도하십시오

db['name1.name2.name3.Properties'].remove([
{
     "key" : "name_key1"
},
{
     "key" : "name_key2"
},
{
     "key" : "name_key3"
}
)]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.