在 mongodb 的树状结构中更新具有给定字段的元素

问题描述 投票:0回答:1

例如,当我有一个类似于单个集合条目中的评论结构时:

"comments": [
    {
        "id": 0,
        "comments": []
    },
    {
        "id": 1,
        "comments": [
            {
                "id": 3,
                "comments": [
                    {
                        "id": 5,
                        "comments": []
                    },
                    {
                        "id": 6,
                        "comments": []
                    }
                ]
            }
        ]
    },
    {
        "id": 2,
        "comments": [
            {
                "id": 4,
                "comments": []
            }
        ]
    }
]

有没有一种好方法可以将另一条评论推送到具有给定 id 值的评论?

database mongodb tree
1个回答
2
投票

由于模式的递归性质,这种结构对于动态查询/更新来说非常复杂。

在不知道消息的“深度”的情况下,没有“简单”的方法来实现您所要求的,如果您想保留当前的结构,我建议您向每条消息添加一个名为“深度”的新字段,通过提前了解这一点,可以更轻松地动态生成查询来更新正确的消息,如下所示:

const depth = 2
const id = 5

const queryKey = `${Array(depth + 1).join('comments.')}id`;
const query = {
    [queryKey]: id
};
const updateKey = `${Array(depth + 1).join('comments.$')}[elem].comments`;

db.collection.updateOne(
    query,
    {
      "$push": {
        [updateKey]: {
          id: "newId",
          depth: depth + 1,
          comments: []
        }
      }
    },
    {
      arrayFilters: [
        {
          "elem.id": id
        }
      ]
    })

这将动态生成正确的查询来更新正确的子文档。

蒙戈游乐场

© www.soinside.com 2019 - 2024. All rights reserved.