MongoDB聚合运算符:$rank

MongoDB聚合运算符:$rank

$rank聚合运算符返回$setWindowFields阶段分区内文档相对排名位置,文档排名先后顺序有$setWindowFields阶段的sortBy字段决定,sortBy只能取一个字段值。另外,如果多个文档有相同的排名,$rank会将文档与后续值放在排名的空隙中。

语法

{
   
    $rank: {
   
    } }

$rank不接受任何参数。

使用

$rank$denseRank的不同之处在于它们对sortBy字段重复值的处理不同,例如,sortField的值有7、9、9、10:

  • $denseRank排名的值为1、2、2、3,重复值9的排名为2,而10的排名为3,没有排名间隙。
  • $rank排名的值为1、2、2、4,重复值9的排名为为2,但10的排名为4,这里存在一个间隙3。

对于文档的sortBy字段值为空或缺失的情况,sortBy字段相关的排名按照BSON比较顺序执行。

举例

使用下面的脚本创建cakeSales集合,包含了在加利福尼亚(CA)和华盛顿(WA)的蛋糕销售记录:

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阶段使用$rank输出每个州的蛋糕销售量quantity排名:

db.cakeSales.aggregate( [
   {
   
   
      $setWindowFields: {
   
   
         partitionBy: "$state",
         sortBy: {
   
    quantity: -1 },
         output: {
   
   
            rankQuantityForState: {
   
   
               $rank: {
   
   }
            }
         }
      }
   }
] )

在本例中:

  • partitionBy: "$state"根据state对集合中的文档进行分区,分为两个区CAWA
  • sortBy: {quantity: -1 }根据quantity对分区内的文档由大到小进行排序,销量最高的quantity排在最前面。
  • output使用$rankrankQuantityForState字段设置为quantity排名。

操作返回下面的结果:

{
   
    "_id" : 4, "type" : "strawberry", "orderDate" : ISODate("2019-05-18T16:09:01Z"),
  "state" : "CA", "price" : 41, "quantity" : 162, "rankQuantityForState" : 1 }
{
   
    "_id" : 2, "type" :
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

原子星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值