Заполнение поля путем агрегирования других коллекций

У меня есть пользователь и коллекция оценок. В коллекции рейтингов есть ratedBy, ratedTo и оценка. Теперь я хочу найти всех пользователей по некоторым критериям, а также получить их ratingAvg. Таким образом, результат будет выглядеть примерно следующим образом:

[
{_id: 44s5dsdde4e4e55e,name:"bob", email: "[email protected]", ratingAvg: 3, ...},
{_id: 3as5dsdde4e4e55e,name:"alice", email: "[email protected]", ratingAvg: 4, ...}
]

Я очень новичок в базах данных и особенно в MongoDB. Я могу найти ratingAvg конкретного пользователя, выполнив это

Ratings.aggregate([
            {
                $match: {ratedTo: Mongoose.Types.ObjectId(userId)}
            }, 
            {
                $group: {
                    _id: "$ratedTo",
                    avgRating: { $avg : "$score" }
                }
            }
        ]);

Но что мне нужно сделать, так это получить пользователей с их полями и вычислить ratingAvg, как указано выше. Что я могу придумать, так это найти пользователей по отдельности с помощью Users.find({field: criteria}), перебрать их и использовать приведенный выше код, чтобы найти их рейтинги. Или решением было бы выполнить поиск и объединить пользователей и рейтинги, а затем объединить их.

Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
1
0
86
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Одним из возможных способов является использование агрегации с:

  • $lookup, чтобы получить все совпадающие рейтинги
  • $addFields с $reduce для расчета суммы и подсчета
  • $addFields с $divide для расчета среднего
  • $project чтобы удалить все временные поля

Детская площадка

Другие вопросы по теме