如何将具有重复项的文档分组并将其数字排序到没有重复项的数组中?



以下是我的示例数据:

[
{ 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}}
])

看看它在操场的例子中是如何工作的

相关内容

  • 没有找到相关文章

最新更新