MongoDB에서 데이터를 쿼리하는 가장 간단한 방법 중 하나입니다.
MQL을 사용하는 모든 쿼리는 Aggregation Framework에서도 할 수 있습니다.
MongoDB쿼리 언어를 사용하는 모든 작업은 Aggregation Framework에서 수행 가능합니다.
db.listingsAndReviews.find(
{"amenities": "Wifi"},
{"price":1, "address":1, "_id":0}).pretty()
db.listingsAndReviews.aggregate([
{$match: {"amenities": "Wifi"}},
{$project: {"price":1, "address":1, "_id":0}}
]).pretty();
Aggregation framework에서는 find가 아닌 aggregate 명령을 사용합니다.
aggregate를 사용하면 Document를 필터링하지 않고 그룹으로 데이터를 집계하거나 데이터를 수정할 수 있습니다.
aggregate를 사용할 땐 대괄호를 이용해 배열을 인자로 사용합니다.
파이프라인처럼 배열 요소의 순서대로 작업을 하기 때문입니다.
$match 를 통과한 후 $project에 진입합니다. 단계별 조건을 설정해 필터할 수 있습니다.
들어온 데이터 스트림을 여러개로 그룹화하는 연산자
(들어온 데이터를 가지고 여러 개의 개별 저장소로 빨아들여 그룹화하는 연산자입니다.)
필터링 단계 없이 원본 데이터를 바로 받아오는 경우, 원본 데이터를 수정하지 않습니다.
필터링 단계가 있다면 통과한 데이터를 다음 단계에서 작업합니다.
(필터링 단계가 있을 경우에는 파이프라인 이전 단계에서 가져온 데이터로 작업합니다.)
ex) 기본 예시
{$group:
{
_id:<expression>,
<field1>: {accumulate1>:<expression1>},
}
}
group을 사용해 기준에 따라 그룹화할 수 있습니다.
$group 단계는 Document를 받을 때 _id 필드 표현식을 사용하여 Document가 속한 그룹을 식별합니다.
$group 구문의 두 번째 부분을 사용하면 파이프라인을 통해 들어오는 데이터에 대해 더 많은 양적 분석을 수행할 수 있습니다.
ex) 실제 예시
db.컬렉션이름.aggregate([
{$project: {"address":1, "_id":0}},
{$group:{_id: "$address.country", "count":{"$sum":1}}}
]);
address 필드만 가져오기 위해 group 연산자를 이용해 address.country로 데이터를 그룹화합니다.
첫 번째 인자로 _id: "$address.country"로 작성 후 두 번째 인자로 몇개의 숙소가 있는지 sum을 통해 집계할 수 있습니다.
sum:1은 1개가 있다는 뜻이 아니라, 조건에 맞는 데이터가 있을경우 1씩 추가해줍니다. 1씩 추가 후 조건이 끝나면 총계를 확인 할 수 있습니다.(자바스크립트의 reduce와 비슷함)
{
"$group":
"_id": "category",
"total": {"$sum": "$price"}
}
====>
{
{
"category": "fish",
"price": 5
},
{
"category": "meat",
"price": 25
},
{
"category": "fish",
"price": 7
},
{
"category": "fish",
"price": 12
},
{
"category": "meat",
"price": 25
}
}
먼저 category를 통해 fish와 meat를 그룹화합니다.
aggregate([
{$<stage1>: {<field>:<value>}, {$<stage2>: {<field>:<value>}}}
])