2012-01-24 6 views
3

est-il un moyen de modifier une référence de collection MongoDB? Avec changement, je veux dire la valeur dans la référence. Je ne peux pas simplement créer un lien direct car la base de données est en cours d'utilisation. Ma structure ressemble à ceMongoDB modifier DBrefs

{ 
     "_id" : ObjectId("4e7c6b47e4b0dea06288ad21"), 
     "license" : "ABC123", 
     "model" : "911", 
     "make" : "Porsche", 
     "owner" : { 
       "$ref" : "users", 
       "$id" : "Test User" 
     } 
} 

Je souhaite modifier l'ID comme

{ "$ref" : "users", "$id" : "NEW USER"} 

Répondre

3

Bien sûr, vous pouvez, mais vous ne pouvez pas le faire avec un ensemble de $ directe:

> db.test.save({a:{$ref:"users", $id:"Test User"}}) 
> db.test.find() 
{ "_id" : ObjectId("4f1e85489d086ee4511551b6"), "a" : DBRef("users", "Test User") } 
> db.test.update({}, {$set:{'a.$id':"NEW USER"}}) 
> db.test.find() 
{ "_id" : ObjectId("4f1e85489d086ee4511551b6"), "a" : { "$id" : "NEW USER", "$ref" : "users" } } 

Comme vous pouvez le voir, cela interrompt les références car la spécification DBRef exige que l'ordre des champs $ ref et $ id soit $ ref en premier.

Vous pouvez mettre à jour comme ceci:

> db.test.update({}, {$set:{a:{$ref:"users", $id:"NEW USER"}}}) 
> db.test.find() 
{ "_id" : ObjectId("4f1e858b9d086ee4511551b7"), "a" : DBRef("users", "NEW USER") } 

Ou tout simplement utiliser "nouvelle DBRef (..)" si vous êtes dans la coquille.

0

Personnellement, j'ai commencé à éviter complètement DBRef car cela ajoute beaucoup de surcharge inutile puisque dans mon cas tous les objets référencés par le champ "user" sont dans la même collection, rendant la première partie de DBRef redudante.

Donc je migrerais vers un nouveau champ (disons "ownerId") et je stockerais simplement l'ObjectId directement là-bas. Évidemment, vous devrez peut-être effectuer une extraction manuelle de l'objet utilisateur, mais cela dépendra du cadre de votre application.