在Mongo中投影嵌套文档

时间:2018-12-24 10:00:43

标签: mongodb

我正在尝试从嵌套结构中查找和投影。例如,我有以下文档,其中每个单元可能都有一个嵌入式子单元:

{
    "_id" : 1,
    "unit" : {
        "_id" : 2,
        "unit" : {
            "_id" : 3,
            "unit" : {
                "_id" : 4
            }
        }
    }
}

我想获得单元1下所有子单元的ID。

[{_id:2}, {_id:3}, {_id:4}]

$graphlookup似乎无法处理这种嵌套结构。据我了解,当单元被保存在单个级别而不嵌套时,并且每个单元都引用其父单元时,它会起作用。

检索所需结果的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

首先,$graphlookup不能解决您的问题,因为它是在document上进行递归搜索,而不是在const a = { "_id": 1, "unit": { "_id": 2, "unit": { "_id": 3, "unit": { "_id": 4 } } } } const parse = o => { const { _id } = o; if (!o.unit) return [{ _id }]; return [{ _id }, ...parse(o.unit) ]; } console.log(parse(a.unit));上进行递归搜索

  

$ graphLookup对带有选项的集合执行递归搜索   通过递归深度和查询过滤器限制搜索。

因此,它不是在文档中进行递归搜索,而是仅对集合(包括多个文档)进行递归搜索,无法处理您的问题。

对于您的问题,我认为这不是Mongo的责任,因为您已经检索了所需的文档。您想将检索到的文档解析为子文档数组,可以用您的语言来完成。

如果使用JavaScript(后端使用Node.JS)的示例,则可以将此文档解析为数组:

//

答案 1 :(得分:0)

您不能从mongodb查询中执行此操作。 Mongodb将用id :1保证文档,并且不会在文档内部递归搜索。 您可以做的是:从mongodb中检索文档,然后将其解析为Map对象,然后递归地从该地图中检索信息。