MongoDB에서 컬렉션 전체와 비교하여 문서 전체를 추출하려면 $$ROOT 시스템 변수를 사용하면 됩니다. $$ROOT는 집계 파이프라인에서 현재 처리 중인 문서 전체를 그대로 참조할 수 있게 해주는 강력한 기능입니다.
1. 샘플 컬렉션 생성하기
먼저 데모용 컬렉션을 만들고 문서를 삽입해 보겠습니다.
> db.demo743.insertOne({id:1,"ShippingDate":"2020-01-21",value:50});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ead893a57bb72a10bcf0680")
}
> db.demo743.insertOne({id:2,"ShippingDate":"2020-05-10",value:30});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ead893c57bb72a10bcf0681")
}
> db.demo743.insertOne({id:3,"ShippingDate":"2020-05-10",value:60});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ead894657bb72a10bcf0682")
}
> db.demo743.insertOne({id:1,"ShippingDate":"2020-05-11",value:75});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ead895657bb72a10bcf0683")
}2. find() 메서드로 전체 문서 조회하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.demo743.find();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5ead893a57bb72a10bcf0680"), "id" : 1, "ShippingDate" : "2020-01-21", "value" : 50 }
{ "_id" : ObjectId("5ead893c57bb72a10bcf0681"), "id" : 2, "ShippingDate" : "2020-05-10", "value" : 30 }
{ "_id" : ObjectId("5ead894657bb72a10bcf0682"), "id" : 3, "ShippingDate" : "2020-05-10", "value" : 60 }
{ "_id" : ObjectId("5ead895657bb72a10bcf0683"), "id" : 1, "ShippingDate" : "2020-05-11", "value" : 75 }3. $$ROOT를 활용한 집계 쿼리 작성하기
이제 $$ROOT를 사용해 각 id 그룹별로 가장 최근 배송일(ShippingDate)을 가진 문서 전체를 추출하는 집계 쿼리를 살펴보겠습니다.
> db.demo743.aggregate([
... {
... "$project":
... {
... "id": "$id",
... "ShippingDate": "$ShippingDate",
... "MyDoc": "$$ROOT"
... }
... },
... {
... "$sort":
... { "ShippingDate": -1
... }
... },
... {
... "$group":
... {
... "_id":{"id":"$id"},
... "Result":{"$first":"$MyDoc"}
... }
... },
... {
... $project:
... {
... "Result.ShippingDate":1, "Result.id":1, "Result.value":1, _id:0}
... }
... ])쿼리 동작 방식 설명
- $project 단계: $$ROOT를 사용해 각 문서 전체를 MyDoc 필드에 저장합니다.
- $sort 단계: ShippingDate를 내림차순(-1)으로 정렬하여 최신 날짜가 앞에 오도록 합니다.
- $group 단계: id별로 그룹화한 후, $first 연산자로 정렬된 순서에서 첫 번째 문서(즉, 가장 최근 배송일의 문서)를 선택합니다.
- 마지막 $project 단계: 필요한 필드만 출력하고 _id는 제외합니다.
4. 실행 결과 확인하기
위 집계 쿼리를 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.
{ "Result" : { "id" : 3, "ShippingDate" : "2020-05-10", "value" : 60 } }
{ "Result" : { "id" : 2, "ShippingDate" : "2020-05-10", "value" : 30 } }
{ "Result" : { "id" : 1, "ShippingDate" : "2020-05-11", "value" : 75 } }결과를 보면 각 id(1, 2, 3)별로 해당 그룹에서 가장 최신 배송일을 가진 문서 전체가 추출된 것을 확인할 수 있습니다. 이처럼 $$ROOT와 $sort, $group, $first를 조합하면 컬렉션 전체를 기준으로 비교 분석하면서 원본 문서를 온전히 유지한 상태로 원하는 데이터를 효율적으로 추출할 수 있습니다.