{
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
}
}
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});
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).
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})
db.example.updateMany({},{"$unset":{"tags.words":1}})
Nous pouvons également l'utiliser pour mettre à jour plusieurs documents.
À 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.
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
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})
{ nom: 'livre', Mots clés: { mots: ['abc', '123'], lat: 33, long: 22 } }
Ans:
db.tablename.remove ({'tags.words': ['abc', '123']})