Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

self referencing update using MongoDB

I wonder if there is a way to make a self referencing update in MongoDB, so you can use object's params on a $set query. Here is an example:

> 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" }

I saw that you can use this syntax on $where queries: 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);

So, I tried with:

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

but it didn't work.

The expected result is:

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

Any thoughts? Thanks in advance

like image 266
fertapric Avatar asked Jan 15 '12 08:01

fertapric


1 Answers

Update:

It can be done by now using

db.labels.updateMany(
   {"test":"hola"},
   [{ $set: { test: "$name" }}],
)

Old Answer

At present there is no straight way to do that. But you can workaround this by

    db.labels.find({"test":"hola"}).forEach(function (doc) {
           doc.test = doc.name;
           db.labels.save(doc); 
    })
like image 192
RameshVel Avatar answered Sep 20 '22 01:09

RameshVel