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

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

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).


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.


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

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


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

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.


1

La solution pour PyMongo (Python mongo):

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

0

Et pour mongomapper,

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

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


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)

-2

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

Rép:

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


-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.


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


-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"
}
)]
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.