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

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

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

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

Réponses:

532

Essayez ceci: si votre collection était un «exemple»

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

Référez ceci:

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

MISE À JOUR :

Le lien ci-dessus ne couvre plus «$ unset». 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 qu'il trouve correspondant. Voir ceci pour une documentation mise à jour:

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

Exemple:

db.example.update({}, {$unset: {words:1}} , {multi: true});
Shaunak
la source
1
Voir la solution à cette question pour l'explication de false / true stackoverflow.com/questions/7714216/…
Dsel
1
Il n'y a plus de commentaire d'un "Nic Cottrell" nulle part sur cette page :)
Dan Dascalescu
6
Suis-je en train de manquer quelque chose, ou est-ce que ça ne va pas depuis 8 ans ou plus, parce que ça tags.wordsdevrait l'être $unset, non words? Voir aussi la réponse de Salvador Dali.
Dan Dascalescu
1
Vous pouvez également utiliser à la updateManyplace de {multi:true}, c'estdb.example.updateMany({},{"$unset":{words:""}})
Kip
158

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

Oui, vous devez utiliser l' $unsetopérateur , mais cette suppression va supprimer la clé de mots qui n'existe 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 la notation par points . Donc, la bonne requête est.

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

Juste pour être complet, je ferai référence à une autre façon de le faire , ce qui est bien pire, mais de cette façon, vous pouvez changer le champ avec n'importe quel code personnalisé (même basé sur un autre champ de ce document).

Salvador Dali
la source
2
De plus, si les balises sont un tableau, cela ressemblerait à ceci: db.example.update ({}, {$ unset: {'tags. $ []. Words': 1}}, false, true)
Manan Shah
21
db.example.updateMany({},{"$unset":{"tags.words":1}})

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

Vipul
la source
2
je trouve cela plus clair que de passer false, truecomme les deux derniers arguments pourupdate()
Kip
17

Pour supprimer ou supprimer un champ dans MongoDB

  • Pour un seul enregistrement

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

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

J'essayais de faire quelque chose de similaire à cela, mais à la place, supprimez la colonne d'un document incorporé. Il m'a fallu un certain temps pour trouver une solution et c'était le premier message que j'ai rencontré, donc j'ai pensé que je publierais ceci ici pour toute autre personne essayant de faire de même.

Disons donc à la place 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 wordsdu document incorporé, procédez comme suit:

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

ou en utilisant le updateMany

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

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

Il utilise l' opérateur all positional ( $[]) qui a été introduit dans la version 3.6

Jonathon Gardner
la source
1

Par défaut, la méthode update () met à jour un seul document. Définissez le paramètre multiple pour mettre à jour tous les documents qui correspondent aux critères de 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})
Amitesh
la source
1

Au départ 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 de mise à jour peut également accepter un pipeline d'agrégation (notez les crochets au carré signifiant l'utilisation d'un pipeline d'agrégation).

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

Xavier Guihot
la source
1

La solution pour PyMongo (Python mongo):

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

Et pour mongomapper,

  • Document: Arrêt
  • Champ à supprimer: shutoff_type

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

Jon Kern
la source
0

Parce que je n'arrêtais pas de trouver cette page lorsque je cherchais un moyen de supprimer un champ à l'aide de MongoEngine, je suppose qu'il pourrait être utile de publier le chemin MongoEngine ici aussi:

Example.objects.all().update(unset__tags__words=1)
Laverie
la source
-2

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

Rép:

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

Poonam Agrawal
la source
-3

Vérification de l'existence de "mots" puis suppression du document

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

true indique la mise à jour de plusieurs documents s'ils correspondent.

Abhi
la source
Vous n'avez pas besoin de vérifier l'existence. La documentation indique que: "Si le champ n'existe pas, alors $ unset ne fait rien (c.-à-d. Aucune opération)."
Dan Dascalescu
-4

vous pouvez également le faire en agrégation en utilisant le projet à 3.4

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

joel Raja
la source
-7

Pour référencer un package et supprimer diverses "clés", essayez ceci

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