使用MongoDB自引用更新

时间:2012-01-15 08:58:00

标签: mongodb mongoid self

我想知道是否有办法在MongoDB中进行自引用更新,因此您可以在$ set查询中使用对象的参数。这是一个例子:

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

我看到你可以在$ where where query: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);

所以,我尝试过:

  

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

但它不起作用。

预期结果是:

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

有什么想法?提前致谢

2 个答案:

答案 0 :(得分:20)

目前没有直接的方法可以做到这一点。但你可以通过

来解决这个问题
    db.labels.find({"test":"hola"}).forEach(function (doc) {
           doc.test = doc.name;
           db.labels.save(doc); 
    })

答案 1 :(得分:0)

MongoDB 4.2的新功能

“从 MongoDB 4.2 开始,db.collection.update()方法可以接受指定要执行的修改的聚合管道。” docs

管道可以访问每个文档的字段,因此可以进行自我参考更新。

请参阅此类更新的documentation on this, which includes an example

以下是来自OP问题的示例,更新为:

db.labels.update(
   {"test":"hello"},
   [{ $set: { test: "$name" }}],
   { multi: true }
);

请注意,管道中使用的$set是指aggregation stage $set,而不是更新运算符$set

对于那些熟悉MongoDB早期版本中的聚合管道的人:$set阶段是$addFields的别名。