我有以下订单集合:
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%。这可能吗?
谢谢。
答案 0 :(得分:0)
您可以保存一个具有集合范围的变量,然后根据需要进行操作。
var total = db.orders.find({ }).count();
db.orders.aggregate([
{
$limit: total * 0.1
}
]);
更新:
很好地使用阶段“ $ count”会影响结果的投影,但是您可以直接将先前的代码用于聚合阶段。
db.orders.aggregate([
{
$limit: db.orders.find({ }).count() * 0.1
}
]);