Come rimuovere completamente un campo da un documento MongoDB?


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

Supponiamo che questo sia un documento. Come rimuovo " words" completamente da tutti i documenti di questa raccolta? Voglio che tutti i documenti siano senza " words":

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

Risposte:


532

Prova questo: se la tua collezione era "esempio"

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

Segnala questo:

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

AGGIORNAMENTO :

Il link sopra non copre più '$ unset'. Assicurati di aggiungere {multi: true}se desideri rimuovere questo campo da tutti i documenti della raccolta; in caso contrario, lo rimuoverà solo dal primo documento trovato corrispondente. Vedi questo per la documentazione aggiornata:

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

Esempio:

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

1
Vedere la soluzione a questo problema per la spiegazione di falso / vero stackoverflow.com/questions/7714216/...
DSEL

1
Non c'è più un commento di "Nic Cottrell" da nessuna parte in questa pagina :)
Dan Dascalescu,

6
Mi sto perdendo qualcosa o è stato sbagliato per 8+ anni, perché tags.wordsdovrebbe essere $unset, no words? Vedi anche la risposta di Salvador Dalì.
Dan Dascalescu,

1
Puoi anche usare updateManyinvece di {multi:true}, cioèdb.example.updateMany({},{"$unset":{words:""}})
Kip

158

All'inizio non capivo perché la domanda avesse una taglia (pensavo che la domanda avesse una bella risposta e non ci fosse nulla da aggiungere), ma poi ho notato che la risposta che è stata accettata e votata 15 volte era in realtà sbagliata!

Sì, devi usare l' $unsetoperatore , ma questo disinserimento rimuoverà la chiave delle parole che non esiste per un documento per una raccolta. Quindi sostanzialmente non farà nulla.

Quindi devi dire a Mongo di cercare nei tag del documento e poi nelle parole usando la notazione a punti . Quindi la query corretta è.

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

Solo per motivi di completamento, farò riferimento a un altro modo di farlo , che è molto peggio, ma in questo modo puoi cambiare il campo con qualsiasi codice personalizzato (anche basato su un altro campo di questo documento).


2
Inoltre, se i tag sono un array, sarebbe così: db.example.update ({}, {$ unset: {'tags. $ []. Words': 1}}, false, true)
Manan Shah,

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

Possiamo anche usarlo per aggiornare più documenti.


2
lo trovo più chiaro che passare false, truecome gli ultimi due argomenti aupdate()
Kip

17

Per rimuovere o eliminare il campo in MongoDB

  • Per singolo record

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

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

2

Stavo cercando di fare qualcosa di simile a questo, ma invece ho rimosso la colonna da un documento incorporato. Mi ci è voluto un po 'per trovare una soluzione e questo è stato il primo post in cui mi sono imbattuto, quindi ho pensato di pubblicarlo qui per chiunque cercasse di fare lo stesso.

Quindi diciamo invece che i tuoi dati siano così:

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

Per rimuovere la colonna wordsdal documento incorporato, procedere come segue:

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

o usando il updateMany

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

Il $unset modificherà solo se il valore esiste ma non eseguirà una navigazione sicura (non verificherà setags esiste prima) quindi è necessario che esista sul documento incorporato.

Questo utilizza l' operatore all posizionale ( $[]) che è stato introdotto nella versione 3.6


1

Per impostazione predefinita, il metodo update () aggiorna un singolo documento. Impostare il multiparametro per aggiornare tutti i documenti che soddisfano i criteri di query.

Modificato nella versione 3.6. Sintassi:

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

Esempio :

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

Nel tuo esempio:

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

1

A partire Mongo 4.2, è anche possibile utilizzare una sintassi leggermente diversa:

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

L' aggiornamento metodo di può anche accettare una pipeline di aggregazione (notare le parentesi quadre che indicano l'uso di una pipeline di aggregazione).

Ciò significa che l' $unsetoperatore utilizzato è quello di aggregazione (al contrario di quello "query" ), la cui sintassi accetta una matrice di campi.


1

La soluzione per PyMongo (Python mongo):

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

0

E per mongomapper,

  • Documento: spegnimento
  • Campo da rimuovere: shutoff_type

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


0

Poiché ho continuato a trovare questa pagina quando cercavo un modo per rimuovere un campo usando MongoEngine, suppongo che potrebbe essere utile pubblicare anche qui MongoEngine:

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

-2

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

Ans:

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


-3

Verifica dell'esistenza di "parole", quindi rimozione dal documento

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

true indica l'aggiornamento di più documenti se abbinati.


Non è necessario verificare l'esistenza. La documentazione afferma che: "Se il campo non esiste, allora $ unset non fa nulla (cioè nessuna operazione)."
Dan Dascalescu,

-4

puoi anche farlo in aggregazione usando il progetto in 3.4

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


-7

Per fare riferimento a un pacchetto e rimuovere varie "chiavi", provare questo

db['name1.name2.name3.Properties'].remove([
{
     "key" : "name_key1"
},
{
     "key" : "name_key2"
},
{
     "key" : "name_key3"
}
)]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.