Je veux mettre à jour un _id
champ d'un document. Je sais que ce n'est pas une très bonne pratique. Mais pour une raison technique, j'ai besoin de le mettre à jour. Si j'essaye de le mettre à jour, j'obtiens:
> db.clients.update({ _id: ObjectId("123")}, { $set: { _id: ObjectId("456")}})
Performing an update on the path '_id' would modify the immutable field '_id'
Et la mise à jour n'est pas faite. Comment puis-je le mettre à jour?
duplicate key error
sur lainsert
ligne et que vous n'êtes pas inquiet du problème mentionné par @skelly, la solution la plus simple consiste simplement à appeler laremove
ligne en premier, puis à appeler lainsert
ligne. Ledoc
devrait déjà être imprimé sur votre écran afin qu'il soit facile à récupérer, dans le pire des cas, même si l'insertion échoue, pour les documents simples.Pour le faire pour toute votre collection, vous pouvez également utiliser une boucle (basée sur l'exemple Niels):
Dans ce cas, UserId était le nouvel ID que je voulais utiliser
la source
list()
est la logique, mais pour les grandes bases de données, cela peut épuiser la mémoireDans le cas où vous souhaitez renommer _id dans la même collection (par exemple, si vous souhaitez préfixer certains _ids):
if (doc._id.indexOf ("2019:")! = 0) {... nécessaire pour empêcher une boucle infinie, puisque forEach choisit les documents insérés, même via la méthode .snapshot () utilisée.
la source
find(...).snapshot is not a function
mais à part ça, excellente solution. De plus, si vous souhaitez le remplacer_id
par votre identifiant personnalisé, vous pouvez vérifier si vousdoc._id.toString().length === 24
souhaitez empêcher la boucle infinie (en supposant que vos identifiants personnalisés ne comportent pas également 24 caractères ),Ici, j'ai une solution qui évite les demandes multiples, pour les boucles et la suppression d'anciens documents.
Vous pouvez facilement créer une nouvelle idée manuellement en utilisant quelque chose comme:
_id:ObjectId()
Mais sachant que Mongo attribuera automatiquement un _id s'il est manquant, vous pouvez utiliser un agrégat pour créer un$project
contenant tous les champs de votre document, mais omettez le champ _id. Vous pouvez ensuite l'enregistrer avec$out
Donc, si votre document est:
Ensuite, votre requête sera:
la source
_id
une valeur donnée, plutôt que de laisser MongoDB en générer une autre.Vous pouvez également créer un nouveau document à partir de la boussole MongoDB ou en utilisant la commande et définir la
specific _id
valeur souhaitée.la source