1

从 [MongoDb 关于更新的官方文档] ( http://docs.mongodb.org/manual/core/update/#Updating-The%24positionaloperator ),我读到:

以下操作在 bios 集合中查询第一个文档,其中 _id 字段等于 6,awards 数组包含一个子文档元素,其 by 字段等于 ACM。如果找到,update() 方法会更新第一个匹配子文档中的 by 字段:

db.bios.update(
   { _id: 6, 'awards.by': 'ACM'  } ,
   { $set: { 'awards.$.by': 'Association for Computing Machinery' } }
)

如果我在这里需要另一个嵌套级别怎么办?也就是说,如果不是:

{ _id: 6, awards: [ { by: 'ACM', prize: 1000}, { by: 'ACS', prize: 2000} ] }

我有类似的东西

{ _id: 6, companies: [ { name: 'yyy', awards: [ { by: 'ACM', prize: 1000}, { by: 'ACS', prize: 2000 } ] } ] }

我想更新 id 为 6、company.name 为“yyy”、company.$.awards.$.by 为“ACM”的那个?这在 MongoDB 中是否可行?

默克。

4

2 回答 2

1

我不敢说你做不到。

甚至还有开放的 JIRA 票:https ://jira.mongodb.org/browse/SERVER-831 。

在 mongoDB 团队提出解决方案之前,您必须更改模式设计。

于 2013-04-10T11:18:57.963 回答
1

现在您可以使用$[]运算符来执行此操作:

db.coll.update({}, {$set: {"a.$[i].b.$[j].c": 5}},  {arrayFilters: [{"i.id": 1},{"j.c":1]});

Input: {a: [{id:1, b: [{c: 0},{c:1}]]} 
Output: {a: [{id:1, b: {[c:0},{c:5}]]}

您将在内部指定所有需要的过滤器arrayFilters

于 2018-04-26T09:39:53.943 回答