【问题标题】:How to list all items in the MongoDB on the tree structure?如何在树结构上列出 MongoDB 中的所有项目?
【发布时间】:2021-07-27 13:05:58
【问题描述】:

考虑这样的结构:

class Group {
  _id: ObjectId
  subGroups: ObjectId[]
  name: string
  info: string
}

数据库中 A 组的文档应该是...

_id: ObjectId("6092387f9c69970c20fe648a")
subGroups: [
  ObjectId("6092387f9c69970c20fe648b"),  // Group B
  ObjectId("6092387f9c69970c20fe648c"), // Group C
],
name: "Group A",
info: "..."

如何在 mongodb 中查询以获取包括自身在内的所有子节点?

例如,

查询 A:输出 A、B、C、D、E、F、G、H、I、J

查询 B:输出 D、E

【问题讨论】:

    标签: typescript mongodb mongoose graphlookup


    【解决方案1】:

    您要使用的称为$graphLookup,它会递归迭代直到找不到更多匹配项,如下所示:

    db.collection.aggregate([
      {
        $match: {
          "name": "Group A"
        }
      },
      {
        $graphLookup: {
          from: "collection",
          startWith: "$subGroups",
          connectFromField: "subGroups",
          connectToField: "_id",
          as: "groupHierarchy",
          
        }
      },
      {
        $project: {
          result: {
            "$concatArrays": [
              [
                "$name"
              ],
              {
                $map: {
                  input: "$groupHierarchy",
                  as: "group",
                  in: "$$group.name"
                }
              }
            ]
          }
        }
      }
    ])
    

    Mongo Playground

    【讨论】:

    • 是否可以获得组列表(整个文档)而不仅仅是名称?
    • 是的,在最后的投影阶段,您可以看到我只返回名称,因为那是您请求的输出,您可以删除它并获取完整的文档。
    • 如果我删除项目阶段,我发现 groupHierarchy 中会丢失 Group A。如何将其添加到最终结果中?
    • mongoplayground.net/p/-twcVhPwT9a 例如,你决定你想要的结构并使用一些结构操作来实现它。
    猜你喜欢
    • 2012-04-01
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多