Задать вопрос
HoHsi
@HoHsi

Как выбрать только уникальные значения из MongoDB?

Добрый день!
Предположим, что есть такая коллекция:
[{
  "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 параллельных запросов к базе, т.е мягко говоря говнокод. Как можно агрегировать эти запросы, что-бы на выходе иметь тот-же результат?
  • Вопрос задан
  • 1303 просмотра
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
@lega
Не храните дубли да и все.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы