агрегированная модель мангуста на основе фильтра

#javascript #node.js #mongodb #express #mongoose

#javascript #node.js #mongodb #выразить #mongoose

Вопрос:

У меня есть модель Review , в которой есть поле product и rating

Я хотел бы найти сумму всех оценок указанного продукта и найти среднее значение путем деления на 5.

 const mongoose = require('mongoose');

const ReviewSchema = mongoose.Schema({
  product: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Product',
    required: true,
  },
  rating: {
    type: Number,
    required: true,
  },
});

module.exports = mongoose.model('Review', ReviewSchema);
  

как бы я агрегировал все рейтинги и фильтровал по продукту, чтобы найти сумму?

Комментарии:

1. можете ли вы предоставить схему продукта

2. поделитесь примерами документов

3. Я просто хочу фильтровать по идентификатору продукта, в модели продукта есть только такие поля, как название, цена, продавец и т.д..

Ответ №1:

Я предполагаю, что вы используете nodejs, вот как я бы это сделал

 const ReviewsModel = require('../Models/Review')
router.get('/average',async (req,res)=>{ 
    try {
        const reviewsPromise = await ReviewsModel.find({}).populate('product')
        if(reviewsPromise[0] == undefined) throw new Error('no reviews')

        const reviewsOfSpecifiedProduct= reviewsPromise.filter(rev=> rev.product.id == specifiedProductId)
        const sumOfRatings =  reviewsOfSpecifiedProduct
                               .map(rev=>rev.rating)//map to list of only ratings 
                               .reduce((a, b)=> a   b , 0)
        const ratingsAverage = sumOfRatings / 5 
        

        res.json(ratingsAverage)
    } catch (error) {
        console.log(error)
        //handle the errors here 
    }
})
  

Комментарии:

1. прохладный… я заменю .find() на .find({product: product.id})

2. о, да, я забыл об этом, тогда вам это не понадобится populate('product') , но я не думаю, что это сработает, потому что вы будете сравнивать строку с un ObjectId .

3. работает нормально const reviews = await Review.find({ product: parent.id });