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

MongoDB에서 두 개의 배열을 동시에 해제($unwind)하는 쿼리 방법

MongoDB에서 두 개의 배열을 해제하는 방법

$unwind는 입력 문서에 포함된 배열 필드를 해체(deconstruct)하여, 배열의 각 요소마다 하나의 문서를 출력하는 MongoDB 집계(aggregation) 연산자입니다.

배열을 해제하려면 MongoDB 집계 파이프라인에서 $unwind를 사용하면 됩니다. 먼저 문서가 담긴 컬렉션을 생성해 보겠습니다.

> db.demo387.insertOne(
...     {
...       "Name" : "101",
...       "Details1" : [
...          {Value:100, Value1:50, Value2:40},
...          {Value:200},
...          {Value:300}
...       ],
...       "Details" : [
...          {Value:100, Value1:30, Value2:26},
...          {Value:200},
...          {Value:300}
...       ]
...    }
... );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e5d197022064be7ab44e7f8")
}

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

> db.demo387.find().pretty();

위 명령은 다음과 같은 결과를 출력합니다.

{
   "_id" : ObjectId("5e5d197022064be7ab44e7f8"),
   "Name" : "101",
   "Details1" : [
      {
         "Value" : 100,
         "Value1" : 50,
         "Value2" : 40
      },
      {
         "Value" : 200
      },
      {
         "Value" : 300
      }
   ],
   "Details" : [
      {
         "Value" : 100,
         "Value1" : 30,
         "Value2" : 26
      },
      {
         "Value" : 200
      },
      {
         "Value" : 300
      }
   ]
}

이제 두 개 이상의 배열이 포함된 문서를 집계하는 쿼리를 살펴보겠습니다. 핵심은 각 배열 필드에 대해 $unwind를 순차적으로 적용한 뒤, $match$expr을 조합하여 두 배열의 특정 값이 일치하는 요소만 남기는 것입니다.

> db.demo387.aggregate([
...    { "$unwind": "$Details1" },
...    { "$unwind": "$Details" },
...    { "$match": { "$expr":
...    { "$eq": ["$Details1.Value", "$Details.Value"] }
... }}
... ])

위 집계 쿼리는 다음과 같은 결과를 출력합니다.

{ "_id" : ObjectId("5e5d197022064be7ab44e7f8"), "Name" : "101", "Details1" : { "Value" : 100, "Value1" : 50, "Value2" : 40 }, "Details" : { "Value" : 100, "Value1" : 30, "Value2" : 26 } }
{ "_id" : ObjectId("5e5d197022064be7ab44e7f8"), "Name" : "101", "Details1" : { "Value" : 200 }, "Details" : { "Value" : 200 } }
{ "_id" : ObjectId("5e5d197022064be7ab44e7f8"), "Name" : "101", "Details1" : { "Value" : 300 }, "Details" : { "Value" : 300 } }

쿼리 동작 원리 정리

첫 번째 $unwind 단계에서 Details1 배열이 개별 문서로 펼쳐지고, 두 번째 $unwind 단계에서 Details 배열이 펼쳐집니다. 이 과정에서 두 배열의 모든 요소 조합(카테시안 곱)이 생성됩니다. 마지막으로 $match$expr, $eq를 사용해 Details1.ValueDetails.Value가 동일한 조합만 필터링하여, 두 배열에서 값이 서로 대응되는 문서만 최종 출력하게 됩니다.