首页 > 解决方案 > Mongodb 聚合限制(按结果数量的百分比)

问题描述

我有一系列订单:

Orders:
{
  //some typical order fields
  cancelationMoment: {
    type: Date
  },
  
  consumer: {
    type: Schema.Types.ObjectId,
    required: 'consumer id required'
  }
  
}

我想获取取消订单较多的消费者(前 10%)。

我目前的实现是:

db.orders.aggregate([
	{$match:{ cancelationMoment: { $exists: true } }},
        {"$group" : {_id:"$consumer", ordersCanceled:{$sum:1}}
        },
        
        {$sort:{"ordersCanceled":-1}},
       
        { $limit:  2}
        
        ]);

但我想获得的不仅仅是前 2 名,而是前 10%。这可能吗?

谢谢。

标签: mongodbaggregation-frameworklimit

解决方案


您可以使用集合范围保存变量,然后根据需要进行操作。

var total = db.orders.find({ }).count();

db.orders.aggregate([  
    { 
        $limit: total * 0.1
    }
]);

更新:

使用阶段“$count”会影响结果的投影,但是您可以直接将前面的代码用于聚合阶段。

db.orders.aggregate([  
    { 
        $limit: db.orders.find({ }).count() * 0.1
    }
]);

推荐阅读