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

MongoDB에서 $lookup으로 다른 컬렉션의 일치 필드와 JSON 배열 필드 집계하기

개요

다른 컬렉션의 일치하는 필드를 기준으로 JSON 배열 필드를 집계하려면 먼저 두 개의 컬렉션을 생성하고 문서를 추가한 뒤, $lookup 연산자를 사용하여 매칭을 수행해야 합니다.

1단계: 첫 번째 컬렉션 생성 및 문서 삽입

먼저 컬렉션을 만들고 문서를 삽입합니다.

> db.demo101.insertOne(
... { "_id" : "1", "Details" : [ { "PId" : "200" }, { "PId" : "201" }, { "PId" : "201" } ] }
... )
{ "acknowledged" : true, "insertedId" : "1" }

2단계: 첫 번째 컬렉션의 문서 확인

find() 메서드를 사용하여 컬렉션의 모든 문서를 조회합니다.

> db.demo101.find();

실행 결과는 다음과 같습니다.

{ "_id" : "1", "Details" : [ { "PId" : "200" }, { "PId" : "201" }, { "PId" : "201" } ] }

3단계: 두 번째 컬렉션 생성 및 문서 삽입

이제 두 번째 컬렉션을 만들고 문서를 추가합니다.

> db.demo102.insertOne(
... { "_id" : "201", "CustEmailId" : "Carol@gmail.com" }
... );
{ "acknowledged" : true, "insertedId" : "201" }

4단계: 두 번째 컬렉션의 문서 확인

find() 메서드로 두 번째 컬렉션의 모든 문서를 조회합니다.

> db.demo102.find();

실행 결과는 다음과 같습니다.

{ "_id" : "200", "CustEmailId" : "John@gmail.com" }
{ "_id" : "201", "CustEmailId" : "Carol@gmail.com" }

5단계: 집계 쿼리 실행

다음은 다른 컬렉션의 일치하는 필드를 기준으로 JSON 배열 필드를 집계하는 쿼리입니다. 이 쿼리에서는 $unwind로 배열을 풀어낸 후, $lookup으로 두 컬렉션을 조인하고, $project$arrayElemAt으로 필요한 값을 추출한 뒤, $group으로 결과를 다시 그룹화합니다.

> db.demo101.aggregate(
... [
...     {$unwind:"$Details"},
...     {$lookup : {from : "demo102", "localField":"Details.PId", "foreignField":"_id", as :"out"}},
...     {$project : {"_id":1, "Details.PId":{$arrayElemAt:["$out.CustEmailId",0]}}},
...     {$group:{_id:"$_id", Details : {$push : "$Details"}}}
... ]
... ).pretty()

최종 결과

위 쿼리를 실행하면 다음과 같은 출력이 생성됩니다. Details 배열 내의 PId 값이 demo102 컬렉션의 CustEmailId 값으로 대체된 것을 확인할 수 있습니다.

{
    "_id" : "1",
    "Details" : [
       {
          "PId" : "John@gmail.com"
       },
       {
          "PId" : "Carol@gmail.com"
       },
       {
          "PId" : "Carol@gmail.com"
       }
    ]
}