【问题标题】:Update multilevel embedded document更新多级嵌入文档
【发布时间】:2017-04-04 23:38:01
【问题描述】:

我在 mongoDB 中有一个相当复杂的数据结构。文档看起来有点像这样

{ 
    "id" : 0, 
    "basket" : [
        {
            "price" : 0.9918, 
            "id" : 2500, 
            "exGroup" : [
                {
                    "exgId"  : 0, 
                    "ePrice" : 0.9918
                }
                {
                    "exgId"  : 1, 
                    "ePrice" : 0.9918
                }
            ]
        }, ]}

我想将一个文档数组添加到嵌入文档的 exGroup 数组中,以便每个嵌入文档看起来像这样

                {
                     "id"  : 0, 
                     "price" : 0.9918
                     "order"  : {
                          "id":0,
                          "exec":
                              [{
                                "quantity" : 1,
                                "price"    : 1.0
                                },
                                {
                                "quantity" : 1,
                                "price"    : 1.01
                                }
                              ]
                 }

我尝试使用如下所示的更新查询来做到这一点:

db.fund.update(
    {
        "id": 0,
        "basket.id": 2500,
        "basket.exGroup.exgId": 0,
        "basket.exGroup.order": {"$exists" : false}
    },
    {
        "$set":
        {
            "basket.exGroup.$.order" : 
             {
               "id":0,
               "exec":
                  [{
                    "quantity":1,
                    "price":0.9978
                  }]
             }
        }
    }
)

不幸的是,这给了我错误“fundId”:0, "日期": ISODate("2016-11-21T11:00:00.000+0000"), “basket.assetId”:2500, "basket.exGroup.exgId": 0

从根本上说,我的问题是我不知道如何正确处理位于多级数组(即 doc.array.doc.array.doc)叶子上的文档

【问题讨论】:

  • 你想把一些东西推到 exgroup 中对吧?
  • 是的。如果有人告诉我如何正确地做到这一点,我想我可以做剩下的

标签: arrays mongodb mongodb-query mongodb-update


【解决方案1】:
db.rich.update(
    {
        "id": 0,
        "basket.id": 2500,
        "basket.exGroup.exgId": 0,
        "basket.exGroup.order": {"$exists" : false}
    },
    {
        "$push":
        {
            "basket.$.exGroup" : 
             {
               "id":0,
               "exec":
                  [{
                    "quantity":1,
                    "price":0.9978
                  }]
             }
        }
    }
)

这基本上会更新 exGroup 并推送一个新文档。但是您需要相应地为您的文档建模。

【讨论】:

  • 这很有帮助,因为它可以帮助我插入文档。如果我以后需要,我仍然无法理解如何更新其中一个值(比如价格)。你能帮忙吗?
  • 当然。一会儿我也会贴出来。现在正在做某事。所以基本上你想匹配和更新篮子里的procie...exgroup。对吗?
  • 是的。如果您可以编辑您的评论并显示它,我想我会很高兴。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-19
  • 2014-06-12
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 2019-12-16
  • 1970-01-01
相关资源
最近更新 更多