{
name: 'book',
tags: {
words: ['abc','123'],
lat: 33,
long: 22
}
}
Supposons que ce soit un document. Comment supprimer words
complètement " " tous les documents de cette collection? Je veux que tous les documents soient sans " words
":
{
name: 'book',
tags: {
lat: 33,
long: 22
}
}
tags.words
devrait l'être$unset
, nonwords
? Voir aussi la réponse de Salvador Dali.updateMany
place de{multi:true}
, c'estdb.example.updateMany({},{"$unset":{words:""}})
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'
$unset
opé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.
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).
la source
Nous pouvons également l'utiliser pour mettre à jour plusieurs documents.
la source
false, true
comme les deux derniers arguments pourupdate()
Pour supprimer ou supprimer un champ dans MongoDB
Pour un seul enregistrement
Pour Multi Record
la source
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:
Pour supprimer la colonne
words
du document incorporé, procédez comme suit:ou en utilisant le
updateMany
Le
$unset
ne le modifiera que si la valeur existe mais il ne fera pas une navigation sûre (il ne vérifiera pas s'iltags
existe 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.6la source
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:
Exemple :
Dans votre exemple:
la source
Au départ
Mongo 4.2
, il est également possible d'utiliser une syntaxe légèrement différente: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'
$unset
opérateur utilisé est celui d'agrégation (par opposition à celui de "requête" ), dont la syntaxe prend un tableau de champs.la source
La solution pour PyMongo (Python mongo):
la source
Et pour mongomapper,
Shutoff.collection.update( {}, { '$unset' => { 'shutoff_type': 1 } }, :multi => true )
la source
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:
la source
{name: 'book', tags: {mots: ['abc', '123'], lat: 33, long: 22}}
Rép:
db.tablename.remove ({'tags.words': ['abc', '123']})
la source
Vérification de l'existence de "mots" puis suppression du document
true indique la mise à jour de plusieurs documents s'ils correspondent.
la source
vous pouvez également le faire en agrégation en utilisant le projet à 3.4
{$ project: {"tags.words": 0}}
la source
Pour référencer un package et supprimer diverses "clés", essayez ceci
la source