2017-01-07 2 views
2

Je souhaite mettre à jour mon champ _id dans l'un des documents (illustré ci-dessous).Mise à jour du champ _id dans MongoDB

{ 
_id : ObjectId("586d9d5d23352af1a4aa05f7"), 
name: "Soham", 
age : 99, 
city : "XYZ" 
} 

Je couru les étapes ci-dessous:

var doc = db.names.find({name:"Soham"}); 
doc._id = 111 ; -- 111 is not present in that collection for any document 
db.names.remove({_id:ObjectId("586d9d5d23352af1a4aa05f7")}); 
db.names.insert(doc); 

Les 3 premières lignes n'ont pas jeté une erreur, mais le moment où je couru la commande d'insertion, il a jeté erreur. Quelqu'un peut-il s'il vous plaît laissez-moi savoir ce qui ne va pas.

Merci d'avance !!!

+1

Vous devez d'abord lire la documentation. Le champ '_id' est l'équivalent SQL ** clé primaire dans MongoDB et son format est [ObjectId] (https://docs.mongodb.com/manual/reference/method/ObjectId/). Il a une structure bien définie. Ainsi, vous ** ne pouvez pas ** définir une valeur arbitraire en tant qu'ID pour un document. Deuxièmement, vous ne devriez jamais faire cela. Quel est ton but? –

+0

@guzgarcia '_id' dans MongoDB n'est pas nécessairement un' ObjectId', il peut être tout ce que vous voulez, y compris un objet complexe. – GaspardP

+0

@Soham: Veuillez inclure l'erreur – GaspardP

Répondre

2

Lance une erreur, car ne peut pas mettre à jour le champ _id. Pour définir un nouvel identifiant, vous devez d'abord trouver le document (en utilisant findOne, puisque vous recherchez seulement 1 document), que de créer un nouveau document avec un nouvel identifiant et de l'insérer, que nous pouvons supprimer en toute sécurité le document. old:

var doc = db.names.find_one({name:"Soham"}); 
doc._id = 111 ; 
db.names.insert(doc); 
db.names.remove({_id:ObjectId("586d9d5d23352af1a4aa05f7")}); 
+0

Merci beaucoup, oui ça a marché. Je faisais la même chose, mais à la place de findOne je l'utilisais juste pour trouver. Quoi qu'il en soit, findOne a fonctionné. Merci encore. – Soham

+0

Il semble trouver ou findOne n'est pas le problème, nous devons d'abord insérer, puis supprimer pas l'inverse. – Soham

+0

Non, ce n'est pas un problème, mais: find retournera un curseur, ce qui permettra d'évaluer dans une liste. findOne renverra seulement 1 document. – sergiuz