我的数据库中有以下文档:
{uid: 1, score: 10}
{uid: 2, score: 11}
{uid: 3, score: 1}
{uid: 4, score: 6}
{uid: 5, score: 2}
{uid: 6, score: 3}
{uid: 7, score: 8}
{uid: 8, score: 10}
我想按分数将它们分成几个桶,即:
得分 | uids | (聚合中的存储桶名称([/tr>|||
---|---|---|---|---|
[0,4) | 3,5,6 | 0 | ||
[4,7) | 4 | 4|||
[7,inf | 1,2,7,8 | 7 |
您可以使用$topN
累加器,而不是$push
,如下所示:
db.collection.aggregate([
{
"$bucket": {
"groupBy": "$score",
"boundaries": [
0,
4,
7
],
"default": 7,
"output": {
"total": {
"$sum": 1
},
"top_frustrated": {
"$topN": {
"n": 3,
"sortBy": {
"score": -1
},
"output": {
"uid": "$uid",
"score": "$score"
}
}
}
},
}
},
])
游乐场链接。
这里唯一的问题是这个操作符存在于MongoDB 5.2及更高版本中。
对于旧版本,这将起作用:
db.collection.aggregate([
{
"$sort": {
score: -1
}
},
{
$bucket: {
groupBy: "$score",
boundaries: [
0,
4,
7
],
default: 7,
output: {
"total": {
$sum: 1
},
"top_frustrated": {
$push: {
"uid": "$uid",
"score": "$score"
}
},
},
}
},
{
"$project": {
total: 1,
top_frustrated: {
"$slice": [
"$top_frustrated",
3
]
}
}
}
])
游乐场链接。