Como remover um campo completamente de um documento do MongoDB?

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

Suponha que este seja um documento. Como removo wordscompletamente " " todos os documentos desta coleção? Quero que todos os documentos fiquem sem " words":

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

Respostas:

532

Tente o seguinte: se sua coleção era 'exemplo'

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

Consulte isto:

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

ATUALIZAÇÃO :

O link acima não cobre mais '$ unset'ing. Certifique-se de adicionar {multi: true}se você deseja remover este campo de todos os documentos da coleção; caso contrário, ele será removido apenas do primeiro documento que corresponder. Consulte isso para obter a documentação atualizada:

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

Exemplo:

db.example.update({}, {$unset: {words:1}} , {multi: true});
Shaunak
fonte
1
Veja a solução para esta pergunta para obter explicações sobre false / true stackoverflow.com/questions/7714216/…
Dsel
1
Não há mais o comentário de "Nic Cottrell" em qualquer lugar desta página :) #
1855 Dan Dascalescu
6
Estou faltando alguma coisa ou isso está errado há mais de 8 anos, porque tags.wordsdeveria estar $unset, não words? Veja também a resposta de Salvador Dali.
Dan Dascalescu
1
Você também pode usar em updateManyvez de {multi:true}, ou seja, db.example.updateMany({},{"$unset":{words:""}})
Kip
158

No começo, não entendi por que a pergunta tem uma recompensa (achei que a pergunta tinha uma boa resposta e não havia mais nada a acrescentar), mas então notei que a resposta que foi aceita e votada 15 vezes estava realmente errada!

Sim, você precisa usar o $unsetoperador , mas esse desmarcado removerá a chave de palavras que não existe para um documento para uma coleção. Então, basicamente, não fará nada.

Então, você precisa dizer ao Mongo para procurar nas tags do documento e nas palavras usando a notação de ponto . Portanto, a consulta correta é.

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

Apenas para fins de conclusão, vou me referir a outra maneira de fazer isso , que é muito pior, mas dessa maneira você pode alterar o campo com qualquer código personalizado (mesmo com base em outro campo deste documento).

Salvador Dalí
fonte
2
Além disso, se tags for uma matriz, seria assim: db.example.update ({}, {$ unset: {'tags. $ []. Words': 1}}, false, true)
Manan Shah
21
db.example.updateMany({},{"$unset":{"tags.words":1}})

Também podemos usar isso para atualizar vários documentos.

Vipul
fonte
2
Eu acho isso mais claro do que passar false, truecomo dois últimos argumentos paraupdate()
Kip
17

Para remover ou excluir o campo no MongoDB

  • Para registro único

    db.getCollection('userData').update({}, {$unset: {pi: 1}})
  • Para Multi Record

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

Eu estava tentando fazer algo semelhante a isso, mas em vez disso, remova a coluna de um documento incorporado. Demorei um pouco para encontrar uma solução e este foi o primeiro post que me deparei, então pensei em publicá-lo aqui para qualquer pessoa que tente fazer o mesmo.

Então, digamos que seus dados sejam assim:

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

Para remover a coluna wordsdo documento incorporado, faça o seguinte:

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

ou usando o updateMany

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

O $unseteditará apenas se o valor existir, mas não fará uma navegação segura (ele não verificará se tagsexiste primeiro), portanto, a existência é necessária no documento incorporado.

Isso usa o operador all position ( $[]), que foi introduzido na versão 3.6

Jonathon Gardner
fonte
1

Por padrão, o método update () atualiza um único documento. Defina o multiparâmetro para atualizar todos os documentos que correspondem aos critérios de consulta.

Alterado na versão 3.6. Sintaxe:

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

Exemplo:

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

No seu exemplo:

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

Iniciando Mongo 4.2, também é possível usar uma sintaxe ligeiramente diferente:

// { 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 } }

O método de atualização também pode aceitar um pipeline de agregação (observe os colchetes que significam o uso de um pipeline de agregação).

Isso significa que o $unsetoperador que está sendo usado é o agregado (em oposição ao da "consulta" ), cuja sintaxe utiliza uma matriz de campos.

Xavier Guihot
fonte
1

A solução para PyMongo (Python mongo):

db.example.update({}, {'$unset': {'tags.words':1}}, multi=True);
Yakir Tsuberi
fonte
0

E para mongomapper,

  • Documento: Desligamento
  • Campo a ser removido: shutoff_type

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

Jon Kern
fonte
0

Como eu continuei encontrando esta página ao procurar uma maneira de remover um campo usando o MongoEngine, acho que pode ser útil postar o caminho do MongoEngine aqui também:

Example.objects.all().update(unset__tags__words=1)
LaundroMat
fonte
-2

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

Resp:

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

Poonam Agrawal
fonte
-3

Verificando se existem "palavras" e removendo do documento

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

true indica atualizar vários documentos, se corresponder.

Abhi
fonte
Você não precisa verificar a existência. A documentação afirma que: "Se o campo não existir, $ unset não fará nada (ou seja, nenhuma operação)."
Dan Dascalescu 28/09
-4

você também pode fazer isso em agregação usando o projeto em 3.4

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

joel Raja
fonte
-7

Para fazer referência a um pacote e remover várias "chaves", tente este

db['name1.name2.name3.Properties'].remove([
{
     "key" : "name_key1"
},
{
     "key" : "name_key2"
},
{
     "key" : "name_key3"
}
)]
aspadacio
fonte