首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用$project更改MongoDB中返回的数据结构

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

Stack Overflow用户
提问于 2018-10-04 21:54:12
回答 2查看 182关注 0票数 0

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

集合中的文档如下所示:

代码语言:javascript
运行
复制
[
    {
      _id: 111,
      department: "abc"
    },
    {
      _id: 222,
      department: "def"
    },
    {
      _id: 333,
      department: "ghi"
    }
]

这是使用聚合的方式,如下所示:

代码语言:javascript
运行
复制
  $group: {
    _id: null,
    data: { $addToSet: "$department" }
  }

然而,这产生的结果并不理想。输出如下所示:

代码语言:javascript
运行
复制
{
    "count": 1,
    "data": [
        {
            "_id": null,
            "data": [
                "abc",
                "def",
                "ghi"
            ]
        }
    ]
}

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

代码语言:javascript
运行
复制
{
  "count": 1,
  "data": [
    "abc",
    "def",
    "ghi",
  ]
}

有没有一种方法可以用投影舞台来做到这一点?

我试过这个:

代码语言:javascript
运行
复制
  {
    $group: {
      _id: null,
      data: { $addToSet: "$department" }
    }
  },
  {
    $project: {
      data: 0,
      _id: 0
    }
  }

但最终返回相同的数据结构。有没有一种方法可以用$project做到这一点?

更新:

在一个建议之后,我尝试了一下:

代码语言:javascript
运行
复制
db.staffmembers.aggregate([
      {
        $group: {
          _id: null,
          data: { $addToSet: "$department" }
        }
      },
      {
        $project: {
          data: {
            $reduce: {
              input: "$data.data",
              initialValue: [],
              in: {
                $concatArrays: ["$$this", "$$value"]
              }
            }
          }
        }
      }
    ]);

..。但这将为data输出一个空数组

代码语言:javascript
运行
复制
{ 
    "_id" : null, 
    "data" : [

    ]
}
EN

回答 2

Stack Overflow用户

发布于 2018-10-04 23:04:12

您可以在管道中使用阶段,从聚合的前一阶段中挑选所需的内容

代码语言:javascript
运行
复制
db.staffmembers.aggregate([
    {
        $group:{
            _id:null,
            data:{$addToSet:"$department"}
        }
    },
    {
        $project:{
            data:1,
            _id:0
        }
    }
])
票数 0
EN

Stack Overflow用户

发布于 2018-10-05 05:30:05

这就是你想要的:

代码语言:javascript
运行
复制
db.collection.aggregate({
    $project: {
        data: { $arrayElemAt: [ "$data.data", 0 ] },
        _id: 0
    }
})

请注意,我有一种感觉,你的管道和/或数据设置有一些新奇的东西。如果您可以共享输入数据和整个管道,这可能是有益的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52648539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档