3

在我的 MongoDB 中,我有 Document1,如下所示。我想进入“main.accounts”(以及后来的“main.entries”)文档,并更新($set)“content”数组中的整个子文档。Wrt 子文档,到目前为止,我'已经能够在“内容”子数组中添加和删除文档。但在这种情况下,我想更新整个文档;不仅仅是更新($set)匹配文档中的一个属性。

下面,我尝试只使用一个 $set,一个带有 $elemMatch 的 $set。而且我也尝试过 findAndModify,但无济于事。当然,我已经 i) RTFM,环顾 ii) 互联网和 iii) SO,以找到解决方案。有没有人能够以这种方式更新整个文档?

谢谢蒂姆

更新尝试 1 - 这是唯一有效的更新,但将整个“内容”数组设置为哈希 ... { "fu" : "bar" }

    db.bookkeeping.update(
      {
        所有者:“twashing@gmail.com”,
        “content.content.tag”:“帐户”,
        “content.content.id”:“一个”
      },
      { $set : { "content.$.content" : { "fu" : "bar" } } }
    )

更新尝试 2 - 这不会失败,但不会更新有问题的文档

    db.bookkeeping.update(
      {
        所有者:“fu”,
        事情:{$elemMatch:{“content.content.tag”:“帐户”,“content.content.id”:“一个”}}
      },
      { $set : { "thing" : { "fu" : "bar" } } }
    )

更新尝试 3 - 这不会失败,但不会更新有问题的文档

    db.bookkeeping.update(
      {东西:{$elemMatch:{所有者:“fu”,“content.content.tag”:“帐户”,“content.content.id”:“one”}}},
      { $set : { "thing.content.content.$" : { "fu" : "bar" } } }
    )

文件1

    {
            “_id”:“fid”,
            “内容” : [
                    {
                            “内容” : [
                                    {
                                            “id”:“一个”,
                                            “标签”:“帐户”
                                    },
                                    {
                                            “id”:“两个”,
                                            “标签”:“帐户”
                                    },
                                    {
                                            “id”:“三个”,
                                            “标签”:“帐户”
                                    },
                                    {
                                            “id”:“四个”,
                                            “标签”:“帐户”
                                    },
                                    {
                                            “id”:“五”,
                                            “标签”:“帐户”
                                    }

                            ],
                            “id”:“main.accounts”,
                            “标签”:“帐户”
                    },
                    {
                            “标签”:“期刊”,
                            “id”:“main.journals”,
                            “内容” : [
                                    {
                                            “标签”:“期刊”,
                                            “id”:“总账”,
                                            “名称”:“总账”,
                                            “类型” : ””,
                                            “平衡” : ””,
                                            “内容” : [
                                                    {
                                                            “标签”:“条目”,
                                                            “id”:“main.entries”,
                                                            “内容” : [ ]
                                                    }
                                            ]
                                    }
                            ]
                    }
            ],
            “所有者”:“福”,
            “标签”:“富巴”
    }

4

2 回答 2

1

您将无法使用位置运算符$更新第二级数组。(数组内的数组)

此链接可能对您有所帮助

于 2012-06-15T06:57:18.503 回答
-1

我相信如果没有一些编程逻辑,您无法在 mongoDB 控制台中执行此操作,因为您在结构中使用了多个数组,并且您正在搜索子文档 (content[documents]) (main.accounts 和 main.entries)数组,它将返回相同的根文档,但在该返回值中,您无法知道内容数组中的哪个位置是您的标准。因此,您无法在正确的位置注入新值。

如果可能的话,我建议重组文档以避免太多嵌套数组(内容->内容->内容->内容),特别是如果您打算对它们的子集进行一些更新。毕竟这是 NoSQL,所以在你的设计中包含一些冗余数据很好,只要这让你的生活更轻松,你的代码更干净。

于 2012-06-16T12:51:18.423 回答