以下是我的示例数据:
[
{ name: "bob",number:20 },
{ name: "bob",number:10 },
{ name: "kol",number:20 },
{ name: "bob",number:20 }
{ name: "kol",number:10 },
{ name: "kol",number:10 }
]
我想获得每个名称的文档,其中包含一个排序的唯一数字数组。预期的输出:
[
{
name:"bob",
number: [10,20] // with sort, not 20,10
},
{
name:"kol",
number: [10,20]
}
]
我尝试过这样的东西,但没有像我想要的那样工作。我没有对数组的数字进行排序。
user.aggregate([
{
$group: {
_id: '$name',
name: { $first: '$name' },
number: {$addToSet: '$number'}
}
},
{$sort: {name: 1}}
])
您只需要在$group
之前按名称命名$sort
,并使用$push
以保留所有数字,而不是$addToSet
。要保持数字为一个集合,只需使用$setIntersection
删除重复项:
db.collection.aggregate([
{$sort: {number: 1}},
{
$group: {
_id: "$name",
number: {$push: "$number"}
}
},
{
$project: {
name: "$_id",
number: {$setIntersection: ["$number"]},
_id: 0
}
},
{$sort: {name: 1}}
])
看看它在操场的例子中是如何工作的