可以使用以下聚合管道实现:
db.collection.aggregate([
{
$group: {
_id: { ext1: "$ext1", ext2: "$ext2" },
count: { $sum: 1 },
data: { $first: "$$ROOT" }
}
},
{
$group: {
_id: "$_id.ext1",
uniqueExt2: { $addToSet: "$_id.ext2" },
dataArr: { $push: "$data" }
}
},
{
$project: {
_id: false,
ext1: "$_id",
dataArr: {
$map: {
input: {
$filter:{
input:"$dataArr",
as:"da",
cond:{
$in:["$$da._id.ext2","$uniqueExt2"]
}
}
},
as:"el",
in:"$$el"
}
}
}
}
])
这个聚合管道首先使用$group
阶段来根据ext1
和ext2
字段进行分组,并计算每组的文档数量,同时保留第一个文档作为代表。
然后,在第二个$group
阶段中,我们再次根据ext1
字段进行分组,并将每个组中唯一的ext2
值收集到一个数组中。另外,我们也将每个组的所有文档保存到一个数组中。
最后,在 $project
阶段,我们只保留了 ext1
和对应的文档数组,而且在这个数组中,我们只保留了ext2
值在唯一ext2
数组中的文档。