#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 });