개요
다른 컬렉션의 일치하는 필드를 기준으로 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"
}
]
}