我有一个这样的集合:
[
{"userId": "0000", "algorithm": "algo1", "status": "Running", "waitingTime": 0},
{"userId": "0001", "algorithm": "algo1", "status": "Received", "waitingTime": 0},
{"userId": "0000", "algorithm": "algo2", "status": "Completed", "waitingTime": 123},
{"userId": "0000", "algorithm": "algo2", "status": "Error", "waitingTime": 134},
{"userId": "0001", "algorithm": "algo2", "status": "Error", "waitingTime": 150},
{"userId": "0001", "algorithm": "algo3", "status": "Completed", "waitingTime": 100},
{"userId": "0000", "algorithm": "algo3", "status": "Completed", "waitingTime": 120},
{"userId": "0001", "algorithm": "algo1", "status": "Received", "waitingTime": 0}
]
我需要找到每个用户的最长等待时间,但仅限于状态“已完成”。每个文档的输出应该有 2 个 props。
- “_id” - 应为原始集合中的“userId”
- “maxWaitingTime” - 应等于“已完成”状态的最长等待时间
对于此示例,输出应如下所示:
[
{"_id": "0000", "maxWaitingTime": 123},
{"_id": "0001", "maxWaitingTime": 100}
]
我尝试将一些过滤查询组合在一起,但效果不佳。我可以结合一两个陈述,但对于这一个我很挣扎。
我尝试将 unique 方法与 find 结合起来以获得唯一的 userId,但没有成功:
db.tasks.distinct("userId").find();
我还尝试执行 find 函数内部的逻辑:
printjsononeline(db.tasks.distinct(userId).find({
userId: "0001"
}).map(doc => doc));
但不幸的是,它不起作用。
最佳答案
db.collection.aggregate([
{
"$match": {//Filter completed
"status": "Completed"
}
},
{
$group: {//Group by user id and find max
"_id": "$userId",
"waitingTime": {
"$max": "$waitingTime"
}
}
}
])
注意:Mongo 区分大小写。人们确实使用 waiting_time 而不是 waitingTime。
关于javascript - 使用多种变体过滤 MongoDB 集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65748264/