如何在mongodb聚合中生成嵌入式数组的并集
我有一套以下格式的文件:如何在mongodb聚合中生成嵌入式数组的并集,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我有一套以下格式的文件: { skill_id: 2, skill_recs: [ { _id: 4, member_ids: [1, 4, 5] } ] }, { skill_id: 5, skill_recs: [ { _id: 4, member_ids: [1, 7, 9] } ]
{
skill_id: 2,
skill_recs: [
{
_id: 4,
member_ids: [1, 4, 5]
}
]
},
{
skill_id: 5,
skill_recs: [
{
_id: 4,
member_ids: [1, 7, 9]
}
]
}
现在我想聚合一组这些文档,这样技能记录由_id合并,所有合并文档的成员id合并成一个值的联合体
{ _id: 4,
member_ids: [1, 4, 5, 7, 9]
}
我主要通过以下方式获得:
db.aggregate([
{
$unwind: '$skill_recs'
},
{
$group: {
_id: '$skill_recs._id',
all_member_ids: {$push: '$skill_recs.member_ids'}
}
},
{
$addFields: {
member_ids: {$setUnion: '$all_member_ids'}
}
}
])
但是,$setUnion
不会对所传递的数组进行并集
相反,它产生:
{ _id: 4,
member_ids: [[1, 4, 5], [1, 7, 9]]
}
有什么方法可以产生这些数组的并集吗?您已经非常接近了,下面是一个如何使用
您需要使用
$reduce
将阵列展平,如下所示:非常好。如果我只想合并数组而不是集合联合,我是否需要$reduce
?试着把我的头绕在“$$this”和“$$value”对上。回答我自己的问题<代码>$concatArray
执行此任务。非常非常好。非常感谢。
db.collection.aggregate([
{
$unwind: "$skill_recs"
},
{
$group: {
_id: "$skill_recs._id",
all_member_ids: {
$push: "$skill_recs.member_ids"
}
}
},
{
$addFields: {
member_ids: {
$reduce: {
input: "$all_member_ids",
initialValue: [],
in: {
$setUnion: [
"$$this",
"$$value"
]
}
}
}
}
}
])