Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB에서 $$ROOT로 전체 컬렉션과 비교해 전체 문서 추출하는 방법

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를 조합하면 컬렉션 전체를 기준으로 비교 분석하면서 원본 문서를 온전히 유지한 상태로 원하는 데이터를 효율적으로 추출할 수 있습니다.