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", 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

原子星

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

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

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

打赏作者

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

抵扣说明:

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

余额充值