【问题标题】:Updating a 3-level nested value in MongoDb在 MongoDb 中更新 3 级嵌套值
【发布时间】:2018-04-26 17:39:53
【问题描述】:

从 [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 中是否可行?

佣兵。

【问题讨论】:

    标签: mongodb nosql


    【解决方案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 中指定所有需要的过滤器。

    【讨论】:

    • 我将此标记为已接受的答案。然而,幸运的是我已经切换回 MySql。每次我因为查询困难等而感到有点不适时,我就会想起我在 Mongo 上的时间,无论我遇到多大的问题,与 MongoDb 相比,它看起来就像小马和彩虹。说真的。
    • SQL“作为一种语言”已经存在了大约 50 年。 Mongo 的语法与 SQL 相比,它仍处于开发的早期阶段。但是当涉及到困难的查询或涉及到一些更新插件时,我总能感受到你的感觉,例如 setOnInsert 运算符 (docs.mongodb.com/manual/reference/operator/update/setOnInsert/…) 或其他许多我曾经使用 SQL 在几分钟内成功完成的事情。
    【解决方案2】:

    我不敢说你做不到。

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

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

    【讨论】:

    • 耶稣。改变这个设计基本上意味着重新设计一切。无法更新嵌套字段是使 MongoDB 与任何其他关系数据库一样有用的限制。我无语了!
    • (我认为您提供的第一个链接已损坏)
    猜你喜欢
    • 2019-03-20
    • 2018-11-23
    • 2018-12-22
    • 1970-01-01
    • 2020-09-15
    • 2015-02-19
    • 1970-01-01
    • 2016-08-04
    • 1970-01-01
    相关资源
    最近更新 更多