$denseRank聚合运算符返回在$setWindowFields阶段分区中文档的排名,排名的顺序由$setWindowFields阶段sortBy的字段值决定。
语法
{
$denseRank: {
} }
$denseRank不需要任何参数。
使用
$rank和$denseRank的不同点在于他们处理排序字段重复值的方式不同,如:排序字段的值有:7、9、9、10:
- $denseRank排名的值为1、2、2、3,重复值9的排名都是2,10的值则排名为3,所有的排名值都是连续的。
$rank排名的值为1、2、2、4,重复值9的排名都为2,但是10的排名为4,中间有一个跳过的排名3。
对于排序字段为值为null或字段值缺失的情况,排名基于BSON比较顺序。
举例
使用下面的脚本创建cakeSales集合:
db.cakeSales.insertMany( [
{
_id: 0, type: "chocolate", orderDate: new Date("2020-05-18T14:10:30Z"),
state: "CA", price: 13, quantity: 120 },
{
_id: 1, type: "chocolate", orderDate: new Date("2021-03-20T11:30:05Z"),
state: "WA", price: 14, quantity: 140 },
{
_id: 2, type: "vanilla", orderDate: new Date("2021-01-11T06:31:15Z"),
state: "CA", price: 12, quantity: 145 },
{
_id: 3, type: "vanilla", orderDate: new Date("2020-02-08T13:13:23Z"),
state: "WA", price: 13, quantity: 104 },
{
_id: 4, type: "strawberry", orderDate: new Date("2019-05-18T16:09:01Z"),
state: "CA", price: 41, quantity: 162 },
{
_id: 5, type: "strawberry", orderDate: new Date("2019-01-08T06:12:03Z"),
state: "WA", price: 43, quantity: 134 }
] )
按整数字段进行密集排名分区
下面的例子在$setWindowFields阶段使用$denseRank依据quantity得出各州蛋糕销售的密集等级
db.cakeSales.aggregate( [
{
$setWindowFields: {
partitionBy: "$state",
sortBy: {
quantity: -1 },
output: {
denseRankQuantityForState: {
$denseRank: {
}
}
}
}
}
] )
partitionBy: "state"依据state字段对文档进行分区,有CA和WA两个分区sortBy:{quantity:-1}依据quantity对分区内的文档按照从大到小进行排序,quantity最大的排在最前面output使用$densRank将quantity字段的密度排名赋予denseRankOrderDateForState字段,结果如下:
{
"_id" : 4, "type" : "strawberry", "orderDate" : ISODate("2019-05-18T16:09:01Z"),
"state" : "CA", "price" : 41, "quantity" : 162, "denseRankQuantityForState" : 1 }
{
"_id" : 2, "type" : "vanilla",

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



