#javascript #mongodb
#javascript #mongodb
Вопрос:
У меня есть такая коллекция:
[
{"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 реквизита для каждого документа.
- «_id» — который должен быть «идентификатором пользователя» из исходной коллекции
- «maxWaitingTime» — должно быть равно максимальному времени ожидания статуса «Завершено»
Для этого примера вывод должен быть примерно таким:
[
{"_id": "0000", "maxWaitingTime": 123},
{"_id": "0001", "maxWaitingTime": 100}
]
Я попытался объединить некоторые фильтрующие запросы вместе, но это не сработало. Я могу объединить один или два оператора, но для этого я борюсь.
Я попытался объединить метод distinct с find, чтобы получить уникальные идентификаторы пользователей, но это не сработало:
db.tasks.distinct("userId").find();
Также я попытался выполнить логику внутри функции поиска:
printjsononeline(db.tasks.distinct(userId).find({
userId: "0001"
}).map(doc => doc));
Но, к сожалению, это не сработало.
Ответ №1:
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.
Ответ №2:
Вам нужно будет использовать агрегацию (см. https://docs.mongodb.com/manual/aggregation / ). match
Оператор позволит вам фильтровать по статусу, а group
оператор позволит вам получить максимальное значение времени ожидания для данного идентификатора пользователя.