2012-01-15 4 views
6

Je me demande s'il existe un moyen d'effectuer une mise à jour d'auto-référencement dans MongoDB, de sorte que vous pouvez utiliser les paramètres d'objet sur une requête $ set. Voici un exemple:mise à jour d'auto-référencement à l'aide de MongoDB

> db.labels.save({"name":"label1", "test":"hello"}) 
> db.labels.save({"name":"label2", "test":"hello"}) 
> db.labels.save({"name":"label3", "test":"hello"}) 
> db.labels.find() 
{ "_id" : ObjectId("4f1200e2f8509434f1d28496"), "name" : "label1", "test" : "hello" } 
{ "_id" : ObjectId("4f1200e6f8509434f1d28497"), "name" : "label2", "test" : "hello" } 
{ "_id" : ObjectId("4f1200eaf8509434f1d28498"), "name" : "label3", "test" : "hello" } 

j'ai vu que vous pouvez utiliser cette syntaxe sur $ lorsque les requêtes: http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-JavascriptExpressionsand%7B%7B%24where%7D%7D

> db.myCollection.find({ a : { $gt: 3 } }); 
> db.myCollection.find({ $where: "this.a > 3" }); 
> db.myCollection.find("this.a > 3"); 
> f = function() { return this.a > 3; } db.myCollection.find(f); 

Alors, j'ai essayé avec:

db.labels.update ({"test": "hola"}, {$ set: {"test": this.name})

mais cela n'a pas fonctionné.

Le résultat attendu est:

{ "_id" : ObjectId("4f1200e2f8509434f1d28496"), "name" : "label1", "test" : "label1" } 
{ "_id" : ObjectId("4f1200e6f8509434f1d28497"), "name" : "label2", "test" : "label2" } 
{ "_id" : ObjectId("4f1200eaf8509434f1d28498"), "name" : "label3", "test" : "label3" } 

Toute pensée? Merci d'avance

Répondre

18

Actuellement, il n'y a pas de façon directe de le faire. Mais vous pouvez contourner ce problème par

db.labels.find({"test":"hola"}).forEach(function (doc) { 
      doc.test = doc.name; 
      db.labels.save(doc); 
    }) 
+0

Merci pour la réponse RameshVel. J'utilise Mongoid, donc je boucle sur les résultats et l'enregistre avec l'ancienne valeur. Je suis inquiet pour la performance. Toute recommandation? – fertapric

+0

@fertapric, désolé non :(J'ai peur que ce soit le seul moyen – RameshVel

+0

@RameshVel Est-ce encore vrai pour la version actuelle de MongoDb? – Cartesius00