$bottom聚合运算符返回一个指定顺序分组的最后一个元素。
{
$bottom:
{
sortBy: { <field1>: <sort order>, <field2>: <sort order> ... },
output: <expression>
}
}
字段说明:
| 字段 | 是否必须 | 描述 |
|---|---|---|
| sortBy | 是 | 指定结果排序方式,跟$sort一样 |
| output | 是 | 指定分组元素输出的内容,可以是任何合法的表达式 |
$bottom不支持作为聚合表达式。$bottom只支持作为window 操作符。$bottom受100M的限制,如果单组超过这一限制将报错。$bottom不会过滤掉空值,也就是空值也参与排序$bottom会将缺失值转换为null,也就是缺失值会当做null排序下面的聚合返回分组中得分最高的文档:
db.aggregate( [
{
$documents: [
{ playerId: "PlayerA", gameId: "G1", score: 1 },
{ playerId: "PlayerB", gameId: "G1", score: 2 },
{ playerId: "PlayerC", gameId: "G1", score: 3 },
{ playerId: "PlayerD", gameId: "G1"},
{ playerId: "PlayerE", gameId: "G1", score: null }
]
},
{
$group:
{
_id: "$gameId",
playerId:
{
$bottom:
{
output: [ "$playerId", "$score" ],
sortBy: { "score": -1 }
}
}
}
}
] )
在这个例子中:
$documents阶段创建了一些字面量(常量)文档,包含了选手的得分$group阶段根据gameId对文档进行了分组,显然文档中的gameId都是G1PlayerD的得分缺失,PlayerE的得分为null,他们的得分都会被当做null处理playerId字段和score字段被指定为输出:["$playerId"," $score"],以数组的形式返回score逆序:sortBy: { "score": -1 }PlayerD和PlayerE并列为最后的元素,PlayerD作为最后一个score返回[
{
_id: 'G1',
playerId: [ [ 'PlayerD', null ] ]
}
]
使用下面的命令,创建gamescores集合:
db.gamescores.insertMany([
{ playerId: "PlayerA", gameId: "G1", score: 31 },
{ playerId: "PlayerB", gameId: "G1", score: 33 },
{ playerId: "PlayerC", gameId: "G1", score: 99 },
{ playerId: "PlayerD", gameId: "G1", score: 1 },
{ playerId: "PlayerA", gameId: "G2", score: 10 },
{ playerId: "PlayerB", gameId: "G2", score: 14 },
{ playerId: "PlayerC", gameId: "G2", score: 66 },
{ playerId: "PlayerD", gameId: "G2", score: 80 }
])
使用$bottom查找单场比赛的最后一名:
db.gamescores.aggregate( [
{
$match : { gameId : "G1" }
},
{
$group:
{
_id: "$gameId",
playerId:
{
$bottom:
{
output: [ "$playerId", "$score" ],
sortBy: { "score": -1 }
}
}
}
}
] )
在本例的管道中:
$match阶段用一个gameId对结果进行筛选,即:G1$group阶段依据gameId对结果进行分组,本例中只有一个分组G1output : ["$playerId"," $score"]为bottom指定输出字段sortBy: { "score": -1 }按照得分进行逆序排序$bottom返回游戏得分最低的元素操作返回下面的结果:
[ { _id: 'G1', playerId: [ 'PlayerD', 1 ] } ]
使用$bottom查找所有游戏的最后一名:
db.gamescores.aggregate( [
{
$group:
{ _id: "$gameId", playerId:
{
$bottom:
{
output: [ "$playerId", "$score" ],
sortBy: { "score": -1 }
}
}
}
}
] )
在本例的管道中:
$group按照groupId对结果排序$bottom返回所有游戏中得分最低的output : ["$playerId", "$score"]指定bottom输出的字段sortBy: { "score": -1 }按照得分进行逆序排序操作返回下面的结果:
[
{ _id: 'G2', playerId: [ 'PlayerA', 10 ] },
{ _id: 'G1', playerId: [ 'PlayerD', 1 ] }
]