Добрый день!
Предположим, что есть такая коллекция:
[{
"task": 1,
"creator": 1,
"progress" : 0,
}, {
"task": 1,
"creator": 1,
"progress" : 0.3,
}, {
"task": 1,
"creator": 1,
"progress" : 0.7,
}, {
"task": 2,
"creator": 1,
"progress" : 0.1,
}, {
"task": 2,
"creator": 1,
"progress" : 0.5,
}, {
"task": 2,
"creator": 1,
"progress" : 0.9,
}]
т.е. у нас есть ID пользователя, ID таски и ее прогресс.
Задача в следующем: выбрать только последние (уникальные) прогрессы для каждей задачи, у конкретного пользователя.
Т.е. на выходе должно быть:
[{
"task": 1,
"creator": 1,
"progress" : 0.7,
}, {
"task": 2,
"creator": 1,
"progress" : 0.9,
}]
Сейчас пробовал сделать
const uniqTasks = Task.find({
creator: 1
})
.distinct('task')
.exec();
Этим получаем словарь, а дальше findOne + sort({_id: -1}) в Promise.all.
Promise.all(uniqTasks.map(task) => {
return Task.findOne({
creator: 1,
task: task
})
.sort({_id: -1})
.exec();
});
Как вы понимаете, это N параллельных запросов к базе, т.е мягко говоря говнокод. Как можно агрегировать эти запросы, что-бы на выходе иметь тот-же результат?