Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 在一条语句中使用多个mongo update运算符?_Mongodb - Fatal编程技术网

Mongodb 在一条语句中使用多个mongo update运算符?

Mongodb 在一条语句中使用多个mongo update运算符?,mongodb,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":"albe

我可以将$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,它可以工作(虽然不正确。从下面的答案中引用,以澄清为什么它不能很好地工作以及什么工作:
增加这两个字段的正确方法如下:>db.test.update({“name”:“albert”},{“$inc”:{“bugs.0.count”:1,“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相结合,从而可以更改数组的大小。

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

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

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

例如:

> 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),但是能够成功完成,因为每个操作都会影响文档的不同部分


我知道这并不完全是您希望做的,但希望它能让您更好地了解更新的工作原理,也许还能提供一些想法,让您了解如何重新构造更新和/或文档以执行应用程序所需的功能。祝您好运。

显然,您不能有两个modi同一个字段的fiers。@SergioTulentsev:我认为它们是两个不同的字段:“bugs”和“bugs.0.count”?好吧,我不知道。MongoDB可能会这样想:)@SergioTulentsev:是的,我很有希望。非常感谢:-)谢谢Marc。奇怪的巧合是,当你键入这个问题的答案时,我正在阅读你的答案。不管怎样,这是否意味着基本上不支持对同一数组中的元素执行多个更新操作?如果是,可能需要支持关于它的任何计划在未来?谢谢。我尝试了使用$inc对同一数组部分进行多次修改,结果成功:db.test.update({“name”:“albert”},{“$inc”:{“bugs.0.count”:1},“$inc”:{“bugs.1.count”:1});我认为只有在同一数组中合并$push和其他操作时才会出现此问题?正如您所发现的,只要更新不冲突,一个数组中的多个元素可能会同时更新。冲突源于试图在修改数组的一个元素的同时更改数组的大小。另一方面,您可能会注意到更新“{“$inc”:{“bugs.0.count”:1},“$inc”:{“bugs.1.count”:1}”没有按预期工作(这是因为更新文档有一个重复的键“$inc”)。增加这两个字段的正确方法如下:>db.test.update({“name”:“albert”},{“$inc”:{“bugs.0.count”:1,“bugs.count”:1})哇,我不知道重复的钥匙“$inc”有问题。谢谢!
> 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." }
>