mongodb - 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%。这可能吗?
谢谢。
解决方案
您可以使用集合范围保存变量,然后根据需要进行操作。
var total = db.orders.find({ }).count();
db.orders.aggregate([
{
$limit: total * 0.1
}
]);
更新:
使用阶段“$count”会影响结果的投影,但是您可以直接将前面的代码用于聚合阶段。
db.orders.aggregate([
{
$limit: db.orders.find({ }).count() * 0.1
}
]);
推荐阅读
- gradle - Jenkins 使用 Gradle 与 Liferay 7.1 集成
- html - html5 视频标签自动加载不起作用,如何在 chrome 或任何浏览器中自动加载
- jenkins - 在 Jenkins 中是否可以默认显示“拉取请求”选项卡(而不是分支)?
- php - 在php中面临格式不正确的数字错误
- html - 如何托管私人 html 网页?
- php - 检测我们是否在页面的索引中(PHP)
- java - Maven 解决方案可以有多语言项目吗?(Java、Python、Scala)
- javascript - 如何使用 useMemo 挂钩来记忆孩子
- android - GooglePlayGames 0.9.64 x Unity 2018.4.2f1 AppCrash
- grpc - Encountered end-of-stream mid-frame 当它在 GRPC 服务器上吐出时是什么意思?