我在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" : [
]
}
答案 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
}
})
请介意,我觉得您的管道和/或数据设置有些时髦。如果您可以共享输入数据和整个管道,那将是有益的。