MongoDB聚合运算符:$denseRank

$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字段对文档进行分区,有CAWA两个分区
  • sortBy:{quantity:-1}依据quantity对分区内的文档按照从大到小进行排序,quantity最大的排在最前面
  • output使用$densRankquantity字段的密度排名赋予denseRankOrderDateForState字段,结果如下:
{ "_id" : 4, "type" : "strawberry", "orderDate" : ISODate("2019-05-18T16:09:01Z"),
  "state" : "CA", "price" : 41, "quantity" : 162, "denseRankQuantityForState" : 1 }
{ "_id" : 2, "type" : "vanilla", "orderDate" : ISODate("2021-01-11T06:31:15Z"),
  "state" : "CA", "price" : 12, "quantity" : 145, "denseRankQuantityForState" : 2 }
{ "_id" : 0, "type" : "chocolate", "orderDate" : ISODate("2020-05-18T14:10:30Z"),
  "state" : "CA", "price" : 13, "quantity" : 120, "denseRankQuantityForState" : 3 }
{ "_id" : 1, "type" : "chocolate", "orderDate" : ISODate("2021-03-20T11:30:05Z"),
  "state" : "WA", "price" : 14, "quantity" : 140, "denseRankQuantityForState" : 1 }
{ "_id" : 5, "type" : "strawberry", "orderDate" : ISODate("2019-01-08T06:12:03Z"),
  "state" : "WA", "price" : 43, "quantity" : 134, "denseRankQuantityForState" : 2 }
{ "_id" : 3, "type" : "vanilla", "orderDate" : ISODate("2020-02-08T13:13:23Z"),
  "state" : "WA", "price" : 13, "quantity" : 104, "denseRankQuantityForState" : 3 }

按日期字段进行密集排名分区

下面的例子在$setWindowFields阶段使用$denseRank依据orderDate得出各州蛋糕销售的密集等级

db.cakeSales.aggregate( [
   {
      $setWindowFields: {
         partitionBy: "$state",
         sortBy: { orderDate: 1 },
         output: {
            denseRankOrderDateForState: {
               $denseRank: {}
            }
         }
      }
   }
] )
  • partitionBy: "state"依据state字段对文档进行分区,有CAWA两个分区
  • sortBy:{orderDate:-1}依据orderDate对分区内的文档按照从小到大进行排序,orderDate最早的排在最前面
  • output使用$densRankorderDate字段的密度排名赋予denseRankOrderDateForState字段,结果如下:
{ "_id" : 4, "type" : "strawberry", "orderDate" : ISODate("2019-05-18T16:09:01Z"),
  "state" : "CA", "price" : 41, "quantity" : 162, "denseRankOrderDateForState" : 1 }
{ "_id" : 0, "type" : "chocolate", "orderDate" : ISODate("2020-05-18T14:10:30Z"),
  "state" : "CA", "price" : 13, "quantity" : 120, "denseRankOrderDateForState" : 2 }
{ "_id" : 2, "type" : "vanilla", "orderDate" : ISODate("2021-01-11T06:31:15Z"),
  "state" : "CA", "price" : 12, "quantity" : 145, "denseRankOrderDateForState" : 3 }
{ "_id" : 5, "type" : "strawberry", "orderDate" : ISODate("2019-01-08T06:12:03Z"),
  "state" : "WA", "price" : 43, "quantity" : 134, "denseRankOrderDateForState" : 1 }
{ "_id" : 3, "type" : "vanilla", "orderDate" : ISODate("2020-02-08T13:13:23Z"),
  "state" : "WA", "price" : 13, "quantity" : 104, "denseRankOrderDateForState" : 2 }
{ "_id" : 1, "type" : "chocolate", "orderDate" : ISODate("2021-03-20T11:30:05Z"),
  "state" : "WA", "price" : 14, "quantity" : 140, "denseRankOrderDateForState" : 3 }

重复值、null和字段缺失值的密度排名

创建一个cakeSalesWithDuplicates集合:

db.cakeSalesWithDuplicates.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 },
   { _id: 6, type: "strawberry", orderDate: new Date("2020-01-08T06:12:03Z"),
     state: "WA", price: 41, quantity: 134 },
   { _id: 7, type: "strawberry", orderDate: new Date("2020-01-01T06:12:03Z"),
     state: "WA", price: 34, quantity: 134 },
   { _id: 8, type: "strawberry", orderDate: new Date("2020-01-02T06:12:03Z"),
     state: "WA", price: 40, quantity: 134 },
   { _id: 9, type: "strawberry", orderDate: new Date("2020-05-11T16:09:01Z"),
     state: "CA", price: 39, quantity: 162 },
   { _id: 10, type: "strawberry", orderDate: new Date("2020-05-11T16:09:01Z"),
     state: "CA", price: 39, quantity: null },
   { _id: 11, type: "strawberry", orderDate: new Date("2020-05-11T16:09:01Z"),
     state: "CA", price: 39 }
] )

在集合中:

  • 蛋糕销售的地点有加利福尼亚州(CA)和华盛顿州(WA)
  • 文档6到8与文档5的quantitystate相同
  • 文档9与文档4的quantitystate相同
  • 文档10的quantitynull
  • 文档11的quantity字段缺失

下面的例子在$setWindowFields阶段使用$denseRank依据quantitycakeSalesWithDuplicates集合文档进行密度排名:

db.cakeSalesWithDuplicates.aggregate( [
   {
      $setWindowFields: {
         partitionBy: "$state",
         sortBy: { quantity: -1 },
         output: {
            denseRankQuantityForState: {
               $denseRank: {}
            }
         }
      }
   }
] )

在本例中:

  • partitionBy: "state"依据state字段对文档进行分区,有CAWA两个分区
  • sortBy:{quantity:-1}依据quantity对分区内的文档按照从大到小进行排序,quantity最大的排在最前面
  • output使用$densRankquantity字段的密度排名赋予denseRankOrderDateForState字段,结果如下:
{ "_id" : 4, "type" : "strawberry", "orderDate" : ISODate("2019-05-18T16:09:01Z"),
  "state" : "CA", "price" : 41, "quantity" : 162, "denseRankQuantityForState" : 1 }
{ "_id" : 9, "type" : "strawberry", "orderDate" : ISODate("2020-05-11T16:09:01Z"),
  "state" : "CA", "price" : 39, "quantity" : 162, "denseRankQuantityForState" : 1 }
{ "_id" : 2, "type" : "vanilla", "orderDate" : ISODate("2021-01-11T06:31:15Z"),
  "state" : "CA", "price" : 12, "quantity" : 145, "denseRankQuantityForState" : 2 }
{ "_id" : 0, "type" : "chocolate", "orderDate" : ISODate("2020-05-18T14:10:30Z"),
  "state" : "CA", "price" : 13, "quantity" : 120, "denseRankQuantityForState" : 3 }
{ "_id" : 10, "type" : "strawberry", "orderDate" : ISODate("2020-05-11T16:09:01Z"),
  "state" : "CA", "price" : 39, "quantity" : null, "denseRankQuantityForState" : 4 }
{ "_id" : 11, "type" : "strawberry", "orderDate" : ISODate("2020-05-11T16:09:01Z"),
  "state" : "CA", "price" : 39, "denseRankQuantityForState" : 5 }
{ "_id" : 1, "type" : "chocolate", "orderDate" : ISODate("2021-03-20T11:30:05Z"),
  "state" : "WA", "price" : 14, "quantity" : 140, "denseRankQuantityForState" : 1 }
{ "_id" : 5, "type" : "strawberry", "orderDate" : ISODate("2019-01-08T06:12:03Z"),
  "state" : "WA", "price" : 43, "quantity" : 134, "denseRankQuantityForState" : 2 }
{ "_id" : 6, "type" : "strawberry", "orderDate" : ISODate("2020-01-08T06:12:03Z"),
  "state" : "WA", "price" : 41, "quantity" : 134, "denseRankQuantityForState" : 2 }
{ "_id" : 7, "type" : "strawberry", "orderDate" : ISODate("2020-01-01T06:12:03Z"),
  "state" : "WA", "price" : 34, "quantity" : 134, "denseRankQuantityForState" : 2 }
{ "_id" : 8, "type" : "strawberry", "orderDate" : ISODate("2020-01-02T06:12:03Z"),
  "state" : "WA", "price" : 40, "quantity" : 134, "denseRankQuantityForState" : 2 }
{ "_id" : 3, "type" : "vanilla", "orderDate" : ISODate("2020-02-08T13:13:23Z"),
  "state" : "WA", "price" : 13, "quantity" : 104, "denseRankQuantityForState" : 3 }

从上面的结果可以看出:

  • 数量和状态相同的文件具有相同的排名,排名是连续的
  • 在 CA 分区的输出中,数量为空的文档和数量为缺失的文档排序最低。这种排序是 BSON 比较顺序的结果,在本例中,将空值和缺失值排序在数字值之后。

相关推荐

  1. MongoDB聚合运算符:$denseRank

    2024-03-15 15:54:01       42 阅读
  2. MongoDB聚合运算符:$denseRank

    2024-03-15 15:54:01       36 阅读
  3. MongoDB聚合运算符:$add

    2024-03-15 15:54:01       55 阅读
  4. MongoDB聚合运算符:$arrayToObject

    2024-03-15 15:54:01       53 阅读
  5. MongoDB聚合运算符;$dateToParts

    2024-03-15 15:54:01       53 阅读
  6. MongoDB聚合运算符:$dayOfWeek

    2024-03-15 15:54:01       55 阅读
  7. MongoDB聚合运算符:$dayOfMonth

    2024-03-15 15:54:01       52 阅读
  8. MongoDB聚合运算符;$dateToString

    2024-03-15 15:54:01       48 阅读
  9. MongoDB聚合运算符:$dayOfYear

    2024-03-15 15:54:01       48 阅读
  10. MongoDB聚合运算符:$dateTrunc

    2024-03-15 15:54:01       46 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-15 15:54:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-15 15:54:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-15 15:54:01       87 阅读
  4. Python语言-面向对象

    2024-03-15 15:54:01       96 阅读

热门阅读

  1. 安装vm tool

    2024-03-15 15:54:01       43 阅读
  2. 《Effective Modern C++》- 极精简版 36-42条

    2024-03-15 15:54:01       40 阅读
  3. 记录启动Dubbo-admin遇到的问题

    2024-03-15 15:54:01       57 阅读
  4. 软考高级:软件工程集成测试的策略概念和例题

    2024-03-15 15:54:01       48 阅读
  5. Uniapp Vue2 image src动态绑定static目录下的图片

    2024-03-15 15:54:01       44 阅读
  6. 力扣题库第9题:找到字符串中所有的异位词

    2024-03-15 15:54:01       44 阅读
  7. Web安全攻防措施

    2024-03-15 15:54:01       39 阅读
  8. 程序分享--排序算法--冒泡排序

    2024-03-15 15:54:01       41 阅读