使用$ project更改MongoDB中返回的数据结构

时间:2018-10-04 13:54:12

标签: mongodb aggregation-framework

我在MongoDB / Node后端中有一个函数,该函数返回部门列表。

集合中的文档如下:

[
    {
      _id: 111,
      department: "abc"
    },
    {
      _id: 222,
      department: "def"
    },
    {
      _id: 333,
      department: "ghi"
    }
]

正在处理聚合,如下所示:

  $group: {
    _id: null,
    data: { $addToSet: "$department" }
  }

但是,这产生的结果并不理想。输出看起来像这样:

{
    "count": 1,
    "data": [
        {
            "_id": null,
            "data": [
                "abc",
                "def",
                "ghi"
            ]
        }
    ]
}

我想做的是返回数据,其中没有在“数据”内部带有“数据”的嵌套数组结构。我想要这个输出:

{
  "count": 1,
  "data": [
    "abc",
    "def",
    "ghi",
  ]
}

有没有办法在投影台上做到这一点?

我尝试过:

  {
    $group: {
      _id: null,
      data: { $addToSet: "$department" }
    }
  },
  {
    $project: {
      data: 0,
      _id: 0
    }
  }

但是最终返回了相同的数据结构。我可以用$project来做到这一点吗?

更新:

在提出建议后,我尝试了以下方法:

db.staffmembers.aggregate([
      {
        $group: {
          _id: null,
          data: { $addToSet: "$department" }
        }
      },
      {
        $project: {
          data: {
            $reduce: {
              input: "$data.data",
              initialValue: [],
              in: {
                $concatArrays: ["$$this", "$$value"]
              }
            }
          }
        }
      }
    ]);

...但是这会为data输出一个空数组:

{ 
    "_id" : null, 
    "data" : [

    ]
}

2 个答案:

答案 0 :(得分:0)

您可以在管道中使用$project阶段来挑选聚合前一阶段的需求

db.staffmembers.aggregate([
    {
        $group:{
            _id:null,
            data:{$addToSet:"$department"}
        }
    },
    {
        $project:{
            data:1,
            _id:0
        }
    }
])

答案 1 :(得分:0)

这是您所追求的:

db.collection.aggregate({
    $project: {
        data: { $arrayElemAt: [ "$data.data", 0 ] },
        _id: 0
    }
})

请介意,我觉得您的管道和/或数据设置有些时髦。如果您可以共享输入数据和整个管道,那将是有益的。