更新MongoDb中的3级嵌套值

时间:2013-04-10 03:54:54

标签: mongodb nosql

从[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的公司,公司名称为'yyy',公司。$。奖励。$。by是'ACM'?这在MongoDB中甚至可能吗?

Merc的。

2 个答案:

答案 0 :(得分:1)

我不敢说你不能这样做。

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

您必须更改架构设计,直到mongoDB团队提出解决方案。

答案 1 :(得分: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内指定所有必需的过滤器。