我能把$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}]}});

但当我try 这样组合时:

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日更新

我在一个数组的不同元素上try 了多个$inc,它可以工作(虽然不正确.下面的答案中引用了这一点,以澄清为什么不工作,以及什么可以工作: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结合起来,可以改变数组的大小.

推荐答案

可以对同一文档执行多个更新,只要这些更新不冲突(因此出现"更新中存在冲突的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),但是能够成功完成,因 for each 操作都会影响文档的不同部分.

我意识到这并不是你希望做的事情,但希望它能让你更好地了解更新的工作原理,或许还能提供一些 idea ,让你的更新和/或文档可以进行重组,以实现应用程序所需的功能.祝你好运

Mongodb相关问答推荐

如何在MongoDB中通过限制和跳过查找项进行匹配

在mongdob中按子文档筛选不起作用

优化游戏应用程序的反馈表单后端设计

如何使用 MindsDB 和 MQL(对于我的 MongoDB 实例)实施零样本分类?

来自嵌套对象数组的 MongoDB 聚合

如何更新mongo中列表最后一个对象的属性

通过insertId MongoDB获取文档

Mongoose 返回包含属性内任何位置的值的所有文档

MongoDb c# driver LINQ vs Native 查询

替换 MongoDB 中数组中的嵌入文档

node.js & express - 应用程序 struct 的全局模块和最佳实践

Mongo查询子文档的多个字段

$lookup 结果 mongodb 的计数

MongoDB $或PHP中的查询

Clojure 和 NoSQL 数据库

如何在任意深度查找 MongoDB 字段名称

如何返回 MongoDB 中文档的 ObjectId 或 _id?和错误$in 需要一个数组

使用 Spring Security + Spring 数据 + MongoDB 进行身份验证

MongoDB 查询:字段不存在或具有特定值

如何在 golang 和 mongodb 中通过 id 查找