Как рассчитать средний рейтинг моего продукта в mongodb?

#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