【问题标题】:How to get all _id from the nested JSON file using aggregation pipeline?如何使用聚合管道从嵌套的 JSON 文件中获取所有 _id?
【发布时间】:2021-04-26 23:54:45
【问题描述】:

我的聚合管道中有以下结构数组。尝试了合并对象和 setUnion 运算符。

{
  "_id": "6085232dd933b53b80a3de0c",
  "parent": "6082b81ea6036499a33d0972",
  "childNodes": [
    {
      "_id": "6084f8376d422a5baf527b6c",
      "childNodes": [
        {
          "_id": "6084f9ab6d422a5baf527b6d",
          "childNodes": [
            {
              "_id": "6084fa356d422a5baf527b6f",
              "childNodes": [
                {
                  "_id": "6084faa06d422a5baf527b70"
                }
              ]
            }
          ]
        },
        {
          "_id": "6084f9ab6d422a5baf527b6d",
          "childNodes": [
            {
              "_id": "6084fa356d422a5baf527b6f",
              "childNodes": [
                {
                  "_id": "6084faa06d422a5baf527b70"
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}

我预计以下结果会产生一些统计数据。

{
 "allNodes":[allChildNodes-_ids]
}

【问题讨论】:

    标签: node.js mongodb mongodb-query aggregation-framework


    【解决方案1】:

    您正在询问文档树的递归遍历。这不是 mongo 擅长的。从技术上讲,您可以使用 $function 在 javascript 中进行操作:

    .aggregate([
      {
        "$project": {
          _id: 0,
          "allNodes": {
            $function: {
              body: function(doc){
                  allIds = function(d) {
                      return [d._id].concat(...((d.childNodes || []).map(allIds)))
                  } 
                  return allIds(doc)},
              args: [
                "$$ROOT"
              ],
              lang: "js"
            }
          }
        }
      }
    ])
    

    但性能会受到影响。尾调用也没有优化,所以要小心嵌套深度的文档。

    【讨论】:

    • 不使用$function操作是否可以实现? reduce、map、accumulator 这些运算符中的任何一个都可以帮助我们吗? @Alex Blex
    • 在一定程度上。 mongo 中还没有递归函数。无论您使用什么运算符,您都需要遵守嵌套文档的特定深度。这个问题暗示你事先不知道深度,对吗?
    • 是的,数组的深度是增量的,无法预测
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    • 2018-05-21
    • 2021-10-25
    相关资源
    最近更新 更多