多个mongo更新运算符在一个语句中?

时间:2012-03-22 13:21:55

标签: mongodb

我可以在一个声明中合并$ pushAll和$ inc吗?

在结合之前,这很好用:

db.createCollection("test");
db.test.insert({"name" : "albert", "bugs" : []});

db.test.update({"name":"albert"}, 
    {"$pushAll" : {"bugs" : [{"name":"bug1", "count":1}]}});

db.test.update({"name":"albert"}, 
    {"$inc" : {"bugs.0.count" : 1}});

db.test.update({"name":"albert"}, 
    {"$pushAll" : {"bugs" : [{"name":"bug2", "count":1}]}});

但是当我尝试这样组合时:

db.createCollection("test");
db.test.insert({"name" : "albert", "bugs" : []});

db.test.update({"name":"albert"}, 
    {"$pushAll" : {"bugs" : [{"name":"bug1", "count":1}]}});

db.test.update({"name":"albert"}, 
    {
       "$pushAll" : {"bugs" : [{"name":"bug2", "count":1}]}, 
       "$inc" : {"bugs.0.count" : 1}
    }
);

发生此错误:

have conflicting mods in update

我想知道有可能做到这一点,而且,我想象的不仅仅是pushAll和inc,但我不确定这是否得到支持?


2012年3月23日更新

我在一个数组的不同元素上尝试了多个$ inc,它有效(尽管不正确。引用下面的答案来澄清为什么这个doensnt运行良好且有效:The correct way to increment both fields is as follows: > db.test.update({"name":"albert"}, {"$inc" : {"bugs.0.count" : 1, "bugs.1.count" : 1}})

db.test.update({"name":"albert"}, 
  {
    "$inc" : {"bugs.0.count" : 1}, 
    "$inc" : {"bugs.1.count" : 1}
  }
);

$ set和$ inc在数组的不同元素上的组合也有效:

db.test.update({"name":"albert"}, 
  {
    "$set" : {"bugs.0.test" : {"name" : "haha"}}, 
    "$inc" : {"bugs.0.count" : 1}, 
    "$inc" : {"bugs.1.count" : 1}
  }
);

但是将这些中的任何一个与$ push或$ pushAll结合起来,都会出错。

所以,我目前的结论是,它不是关于同一阵列中多个元素的多个操作是问题,但将这些操作与$ push或$ pushAll组合可以改变阵列是问题。

1 个答案:

答案 0 :(得分:21)

可以对同一文档执行多次更新,只要这些更新不冲突(因此“更新中存在冲突的mod”错误)。

因为“$ push”:{“bugs”:[{“name”:“bug1”,“count”:1}]}和“$ inc”:{“bugs.0.count”:1}是两者都试图修改文档的相同部分(即“错误”数组),它们发生冲突。

如果每个更新都影响文档的不同部分,则可以合并多个更新:

例如:

> db.test.drop()
true
> db.test.save({ "_id" : 1, "name" : "albert", "bugs" : [ ] })
> db.test.update({"name":"albert"}, {"$pushAll" : {"bugs" : [{"name":"bug1", "count":1}]}, "$inc" : {"increment" : 1}, $set:{"note":"Here is another field."}})
> db.test.find()
{ "_id" : 1, "bugs" : [ { "name" : "bug1", "count" : 1 } ], "increment" : 1, "name" : "albert", "note" : "Here is another field." }
> 

更新包含三个不同的操作($ pushAll,$ inc和$ set),但能够成功完成,因为每个操作都会影响文档的不同部分。

我意识到这并不是您希望做的事情,但希望它能让您更好地了解更新的工作原理,并提供一些有关如何重新构建更新和/或文档以执行更新的建议。您的应用程序所需的功能。祝好运。