【问题标题】:MongoDB update deeply nested arrayMongoDB 更新深度嵌套数组
【发布时间】:2014-11-06 01:22:52
【问题描述】:

考虑以下文档:

{
    "comments": [
        {
            "id" : 1,
            "userid": "john",
            "comment": "lorem ipsum...",
            "responses": [
                {
                    "id" : 2,
                    "userid": "smith",
                    "comment": "lorem ipsum...",
                    "responses": [
                        {
                            "id" : 3,
                            "userid": "random",
                            "comment": "lorem ipsum...",
                            "responses": [] // I want to push a comment into this array
                        },
                        {
                            "id" : 4,
                            "userid": "guy",
                            "comment": "lorem ipsum..."
                        }
                    ]
                },
                {
                    "id" : 5,
                    "userid": "adam",
                    "comment": "lorem ipsum..."
                }
            ]
        }
    ]
}

有没有办法将文档推送到 responses 数组中?因此,在这种情况下,用户想要对 3 级评论发表评论,而我想将该评论推送到数组中。我可以在评论时将数组位置发送给用户并返回给服务器,但我很确定这是不可靠的。此外,如果在这两者之间发生删除(我猜(?)),数组中的位置会发生变化,所以这真的是不行的。

【问题讨论】:

  • 每当我需要更新/编辑文档时,我都会使用 Robomongo。它快速简单
  • 这并不能真正解决我的问题。
  • 是否需要通过写命令来更新文档?
  • 我需要在 Go 的后端自动更新文档。
  • 所有 cmets 是否都有全局唯一 ID,无论它们位于嵌套级别的哪个位置?

标签: mongodb


【解决方案1】:

如果您知道要达到该级别的索引顺序,那么是的:

> db.test.update({ ... }, { "$push" : { "comments.0.responses.0.responses.0.responses" : "this is my response" } })

0 是索引。然而,像这样的多重嵌套结构几乎可以肯定是一个糟糕的数据建模选择。您应该考虑其他选择。也许modeling tree structures 上的文档会有所帮助?

【讨论】:

  • 由于它是一个网络应用程序,我不会依赖索引,任何事情都可能发生。我不确定,我应该如何改造它。我唯一需要的是能够在每个级别按日期字段(不在原始问题中)对 cme​​ts 进行排序。我猜我应该使用单个数组并使用父 ID 将所有 cmets 推送到其中,然后在应用程序级别执行其余操作。但是,如果您有任何其他(更好的?)建议,我愿意接受。 (或者使用聚合框架,但这会更好的性能吗?)
猜你喜欢
  • 1970-01-01
  • 2019-05-05
  • 2019-01-13
  • 2013-08-12
  • 2021-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多