MongoDB Aggregate 사용시 동적 연산 및 페이징 처리
2020. 4. 21. 22:24ㆍ서버 프로그래밍
정렬 기준이 되는 값을 복잡한 조건에 의해 동적으로 생성해서 정렬하고자 할 경우에는 $let, $cond, $eq 등의 명령을 이용하여 연산을 하고, 연산된 값을 기준으로 정렬을 시킬 수 있다.
db.sales.aggregate( [
{
$project: {
finalTotal: {
$let: {
vars: {
total: { $add: [ '$price', '$tax' ] },
discounted: { $cond: { if: '$applyDiscount', then: 0.9, else: 1 } }
},
in: { $multiply: [ "$$total", "$$discounted" ] }
}
}
}
}
] )
https://docs.mongodb.com/manual/reference/operator/aggregation/let/
연산 결과를 페이징 처리하고자 할때에는 $facet 명령을 이용하여 $skip과 $limit으로 처리하면 된다.
단, 주의할 점은 aggregate 명령 결과는 항상 list()를 이용하여 배열로 바꾼다음 값을 추출해야한다는 점이다.
아래의 예제의 경우 result[0]['data']로 접근을 해야 페이징된 결과값을 얻어올 수 있다.
db.Order.aggregate([
{ '$match' : { "company_id" : ObjectId("54c0...") } },
{ '$sort' : { 'order_number' : -1 } },
{ '$facet' : {
metadata: [ { $count: "total" }, { $addFields: { page: NumberInt(3) } } ],
data: [ { $skip: 20 }, { $limit: 10 } ] // add projection here wish you re-shape the docs
} }
] )
https://stackoverflow.com/questions/48305624/how-to-use-mongodb-aggregation-for-pagination
https://docs.mongodb.com/manual/reference/operator/aggregation/facet/