필요한것은 상점별 리뷰 갯수와 별점
리뷰 갯수는 이전편에서 이미 받아왔고
별점은 값을 더해줘야 한다.
상점 평점=총 별점을 더한값/리뷰갯수 이므로...
별점을 더하려면 for문을 써야하나? 그러면 font단에서 계산을 한다는건데.. back에서 계산을 마친 후에 front에서는 조회만 하는게 좋을것 같다. 리뷰 갯수도 back에서 계산했으니까...?
db명.컬렉션명.aggregate([
{ $match: { 그룹화할 필드명 : 필드 값 } },
{ $group: { _id: "$그룹화할 필드명", 반환할 값: { $sum: "$더해줄 필드명" } } }
])
const pointSum = await Review.aggregate([
{ $match: { bakery_id: Number(req.query.bakery )} },
{ $group: { _id: "$bakery_id", totalPoints: { $sum: "$point" } } }
])
이렇게 별점을 더하는것 까지는 문제 없었음...but 평점을 매기려면 리뷰 갯수를 받아와야하는데 다른 router를 통해 review 갯수를 조회하고 전역변수로 저장한뒤 별점 합계가 있는 router로 값을 가져오려고 하니 당연히.. 값을 받아오기전에 평점을 내는 계산을 해버려서 NaN이 뜸
// 리뷰 갯수, 상점 평점 조회
router.get('/grade', async function(req, res, next) {
try{
// 리뷰 갯수
const reviewCount = await Review.countDocuments({
$nor: [{ deleted: true }],
bakery_id: Number(req.query.bakery),
})
// 별점 합
const pointSum = await Review.aggregate([
{ $match: { bakery_id: Number(req.query.bakery )} },
{ $group: { _id: "$bakery_id", totalPoints: { $sum: "$point" } } }
])
// 평점
const grade = Number(pointSum[0].totalPoints)/Number(reviewCount);
return res.send({ status : 200, result : {reviewCount, grade} });
}
catch(e){
console.error(e);
return res.send({ status : -1, result : e });
}
});