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

MongoDB에서 하위 문서 배열에서 특정 ID(234로 시작)의 레코드 조회하기

MongoDB에서 하위 문서(subdocument) 배열 안에서 원하는 레코드만 추출하려면 $unwind 연산자와 $push 연산자를 함께 사용하는 것이 효과적입니다. 또한 '234'로 시작하는 ID를 필터링할 때는 정규식(regex)을 활용하면 간편하게 처리할 수 있습니다.

샘플 컬렉션 생성하기

먼저 문서를 포함한 컬렉션을 생성해 보겠습니다.

> db.demo556.insertOne(
... {
...    _id:101,
...    details:[
...       {
...          id:"234336",
...          Name:"Chris"
...       },
...       {
...          id:"123456",
...          Name:"Bob"
...       },
...       {
...          id:"234987",
...          Name:"Carol"
...       },
...       {
...          id:"989768",
...          Name:"David"
...       },
...       {
...          id:"234888",
...          Name:"Sam"
...       },
...       {
...          id:"847656",
...          Name:"John"
...       }
...    ]
... }
... );
{ "acknowledged" : true, "insertedId" : 101 }

저장된 문서 확인하기

find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.

> db.demo556.find();

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

{ "_id" : 101, "details" : [
   { "id" : "234336", "Name" : "Chris" },
   { "id" : "123456", "Name" : "Bob" },
   { "id" : "234987", "Name" : "Carol" },
   { "id" : "989768", "Name" : "David" },
   { "id" : "234888", "Name" : "Sam" },
   { "id" : "847656", "Name" : "John" } 
] }

하위 문서 배열에서 조건에 맞는 레코드 조회하기

이제 애그리게이션 파이프라인을 사용하여 '234'로 시작하는 ID를 가진 하위 문서만 추출하는 쿼리를 살펴보겠습니다.

> db.demo556.aggregate({
...    $match: {
...       "_id": 101
...    }
... }, {
...    $unwind: "$details"
... }, {
...    $match: {
...       "details.id": {
...          $regex: /^234/
...       }
...    }
... }, {
...    $group: {
...       _id: "$_id",
...       "Detail": {
...          $push: "$details"
...       }
...    }
... }).pretty();

쿼리 동작 방식 살펴보기

이 애그리게이션 쿼리는 다음 단계로 동작합니다.

1. $match: _id가 101인 문서만 먼저 필터링합니다.
2. $unwind: details 배열의 각 요소를 개별 문서로 분해합니다.
3. $match + $regex: 분해된 문서 중 id가 '234'로 시작하는 것만 걸러냅니다.
4. $group + $push: 필터링된 하위 문서들을 다시 하나의 배열로 묶어줍니다.

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

{
   "_id" : 101,
   "Detail" : [
      {
         "id" : "234336",
         "Name" : "Chris"
      },
      {
         "id" : "234987",
         "Name" : "Carol"
      },
      {
         "id" : "234888",
         "Name" : "Sam"
      }
   ]
}

결과를 보면 원본 배열 6개의 요소 중에서 ID가 '234'로 시작하는 Chris, Carol, Sam 세 개의 하위 문서만 깔끔하게 추출된 것을 확인할 수 있습니다. 이처럼 $unwind로 배열을 펼친 후 조건으로 필터링하고, $push로 다시 그룹화하는 패턴은 MongoDB에서 중첩 배열 데이터를 다룰 때 매우 유용하게 활용됩니다.