#mongodb
#mongodb
Вопрос:
Это запрос, который я использовал для получения среднего значения рейтинга, но результат был нулевым:
db.products.aggregate([{$unwind: "$reviews"}, {$group: {_id: "$reviews", ratingAvg: {$avg: "$rating"}}}])
Это моя схема продукта:
category: String,
name: String,
price: Number,
image: String,
description: String,
stock: Number,
reviews: [
{
type: mongoose.Schema.Types.ObjectID, ref: 'Review'
}
})
Это моя схема обзора:
text: String,
rating: Number,
// author: {
// id: {type: mongoose.Schema.Types.ObjectID, ref: 'User'},
// name: String
// }
author: String
})
Каждый раз, когда я запускаю этот запрос, я получаю:
{ "_id" : ObjectId("5f79d1b4b4b3c1061f1fbe52"), "ratingAvg" : null }
{ "_id" : ObjectId("5f79d1a5b4b3c1061f1fbe51"), "ratingAvg" : null }
{ "_id" : ObjectId("5f79d196b4b3c1061f1fbe4f"), "ratingAvg" : null }
Он показывает ratingAvg как»null», тогда как у меня есть рейтинги для этого продукта в моей базе данных.
Комментарии:
1. Вы развернули массив, он является объектом. Итак, вам нужно вызвать рейтинг, используя точечную аннотацию. Работает mongoplayground.net/p/Hw37KjNCP4T
2. Мне нужно среднее значение всех оценок продукта. Это дает среднее значение для одного и того же текста. А также я попробовал это, но не сработало, он по-прежнему показывал null.
3. mongoplayground.net/p/3ss0LOlkAgf помогает ли это вам
4. нет, не сработало
5. Если вы не скажете мне, в чем проблема, как я могу вам помочь? Предоставьте свои примерные данные и ожидаемый результат. Еще вы можете попробовать то, что я вам дал
Ответ №1:
$lookup
помогает объединить две коллекции.
[
{
"$lookup": {
"from": "Review",
"localField": "reviews",
"foreignField": "_id",
"as": "reviews"
}
},
{
$unwind: "$reviews"
},
{
$group: {
_id: null,
ratingAvg: {
$avg: "$reviews.rating"
}
}
}
]
Затем вы можете легко найти среднее значение, используя $avg
вместе с $group
после разрушения массива с помощью $uniwnd
Рабочая игровая площадка Mongo