web-dev-qa-db-fra.com

Comment supprimer un champ complètement d'un document MongoDB?

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

Supposons que ceci soit un document. Comment supprimer "words" de tous les documents de cette collection? Je veux que tous les documents soient sans "words":

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

Essayez ceci: si votre collection était 'exemple'

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

Reportez ceci:

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

METTRE À JOUR

Le lien ci-dessus ne couvre plus '$ unset'ing. Assurez-vous d'ajouter {multi: true} si vous souhaitez supprimer ce champ de tous les documents de la collection. sinon, il ne le supprimera que du premier document correspondant. Voir ceci pour la documentation mise à jour:

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

Exemple:

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

Au début, je ne comprenais pas pourquoi la question avait une prime (je pensais que la question avait une bonne réponse et qu'il n'y avait rien à ajouter), mais j'ai alors remarqué que la réponse qui avait été acceptée et majorée 15 fois était en fait fausse!

Oui, vous devez utiliser $unset opérateur , mais ceci non défini va supprimer les mots clés qui n'existent pas pour un document pour une collection. Donc, fondamentalement, cela ne fera rien.

Vous devez donc dire à Mongo de regarder dans les balises du document, puis dans les mots en utilisant notation par points . Donc, la requête correcte est.

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

Par souci d’achèvement, je ferai référence à une autre façon de le faire , ce qui est bien pire, mais vous pouvez ainsi modifier le champ avec n’importe quel code personnalisé (même à partir d’un autre champ de ce document).

135
Salvador Dali

Pour supprimer ou supprimer un champ dans MongoDB

  • Pour enregistrement unique 

    db.getCollection('userData').update({}, {$unset: {pi: 1}})
    
  • Pour enregistrement multiple 

    db.getCollection('userData').update({}, {$unset: {pi: 1}}, {multi: true})
    
16
Viral Patel
db.example.updateMany({},{"$unset":{"tags.words":1}})

Nous pouvons également l'utiliser pour mettre à jour plusieurs documents.

9
Vipul

À partir de _Mongo 4.2_, il est également possible d’utiliser une syntaxe légèrement différente:

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

La méthode pdate peut également accepter un pipeline d'agrégation (notez les crochets indiquant l'utilisation d'un pipeline d'agrégation).

Cela signifie que l'opérateur $unset utilisé est celui d'agrégation (par opposition à l'opérateur "requête" ), dont la syntaxe utilise un tableau de champs.

1
Xavier Guihot

J'essayais de faire quelque chose de similaire à cela, mais de retirer plutôt la colonne d'un document incorporé. Il m'a fallu un certain temps pour trouver une solution et c'était le premier message que je rencontrais. Je pensais donc que je le posterais ici pour tous ceux qui essaient de faire de même.

Disons plutôt que vos données ressemblent à ceci:

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

Pour supprimer la colonne words du document incorporé, procédez comme suit:

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

ou en utilisant la updateMany

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

Le $unset ne l'éditera que si la valeur existe mais il ne fera pas une navigation sûre (il ne vérifiera pas si tags existe en premier) donc l'existant est nécessaire sur le document incorporé.

Ceci utilise l'opérateur tout positionnel ($[]) introduit dans la version 3.6

1
Jonathon Gardner

Par défaut, la méthode update () met à jour un seul document. Définissez Multi Parameter pour mettre à jour tous les documents correspondant aux critères de la requête.

Modifié dans la version 3.6 . Syntaxe: 

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

Exemple :

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

Dans votre exemple:

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

{ nom: 'livre', Mots clés: { mots: ['abc', '123'], lat: 33, long: 22 } }

Ans:

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

0
Poonam Agrawal