리뷰에서 받아온 별점으로 상점 평점 매기기

keep_going·2023년 3월 31일
0

문제해결

목록 보기
7/36

필요한것은 상점별 리뷰 갯수와 별점
리뷰 갯수는 이전편에서 이미 받아왔고
별점은 값을 더해줘야 한다.
상점 평점=총 별점을 더한값/리뷰갯수 이므로...
별점을 더하려면 for문을 써야하나? 그러면 font단에서 계산을 한다는건데.. back에서 계산을 마친 후에 front에서는 조회만 하는게 좋을것 같다. 리뷰 갯수도 back에서 계산했으니까...?

  • 문제
    mongoDB에서 컬렉션(reviews)에서 특정 쿼리(bakery_id)를 만족하는 필드(point)값을 받아서 더하는 방법?
  • 해결
    aggregate()메서드 사용
db명.컬렉션명.aggregate([
  { $match: { 그룹화할 필드명 : 필드 값 } },
  { $group: { _id: "$그룹화할 필드명", 반환할 값: { $sum: "$더해줄 필드명" } } }
])
  1. $match 연산자를 사용하여 bakery_id가 일치하는 데이터를 찾는다.
  2. $group 연산자를 사용하여 bakery_id로 그룹화하고, $sum 연산자를 사용하여 point 필드값을 더한다.
const pointSum = await Review.aggregate([
  { $match: { bakery_id: Number(req.query.bakery )} },
  { $group: { _id: "$bakery_id", totalPoints: { $sum: "$point" } } }
])
  • 의문점
    _id는 단순한 변수명인지 필수값인건지?
    -> 그룹핑할 기준이 되는 필드를 지정하는데 사용되는 특별한 필드이므로 다른 이름을 쓰면 오류 생김

이렇게 별점을 더하는것 까지는 문제 없었음...but 평점을 매기려면 리뷰 갯수를 받아와야하는데 다른 router를 통해 review 갯수를 조회하고 전역변수로 저장한뒤 별점 합계가 있는 router로 값을 가져오려고 하니 당연히.. 값을 받아오기전에 평점을 내는 계산을 해버려서 NaN이 뜸

  • 문제
    다른 router를 이용해 mongoDB에서 countDocuments()로 가져온 리뷰갯수값을 어떻게 가져올것인가
  • 해결
    하나의 router로 통합시키면 되지~
// 리뷰 갯수, 상점 평점 조회
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 });
  }

});
profile
keep going

0개의 댓글