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

MongoDB find()로 재귀 검색하기: 점 표기법(dot notation) 활용 방법

MongoDB find()로 재귀 검색 수행하기

MongoDB에서 find() 메서드에 점 표기법(dot notation)을 적용하면 배열이나 중첩된 문서 내부의 필드까지 한 번에 검색할 수 있습니다. 복잡한 집계 파이프라인 없이도 하위 필드의 값을 조건으로 지정해 원하는 문서를 손쉽게 찾아낼 수 있어, 실무에서 가장 널리 쓰이는 조회 방식 중 하나입니다.

먼저 예제에 사용할 컬렉션을 생성하고 문서를 삽입해 보겠습니다.

> db.findOperationDemo.insertOne({"ClientDetails":[{"ClientId":101,"ClientName":"Chris"},{"ClientId":102,"ClientName":"Robert"}]});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cd9a118b50a6c6dd317ad99")
}
> db.findOperationDemo.insertOne({"ClientDetails":[{"ClientId":110,"ClientName":"David"},{"ClientId":112,"ClientName":"Mike"}]});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cd9a12fb50a6c6dd317ad9a")
}

다음은 find() 메서드를 사용해 컬렉션의 모든 문서를 조회하는 쿼리입니다.

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

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

{
    "_id" : ObjectId("5cd9a118b50a6c6dd317ad99"),
    "ClientDetails" : [
       {
          "ClientId" : 101,
          "ClientName" : "Chris"
       },
       {
          "ClientId" : 102,
          "ClientName" : "Robert"
       }
   ]
}
{
    "_id" : ObjectId("5cd9a12fb50a6c6dd317ad9a"),
    "ClientDetails" : [
       {
          "ClientId" : 110,
          "ClientName" : "David"
       },
       {
          "ClientId" : 112,
          "ClientName" : "Mike"
       }
   ]
}

점 표기법으로 재귀 검색 실행하기

이제 점 표기법을 활용해 배열 내부의 특정 필드 값을 조건으로 검색해 보겠습니다. "ClientDetails.ClientId"처럼 상위 필드와 하위 필드를 마침표(.)로 연결하면, MongoDB가 ClientDetails 배열의 각 요소를 자동으로 순회하며 조건과 일치하는 문서를 찾아줍니다.

> db.findOperationDemo.find({"ClientDetails.ClientId":110});

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

{ "_id" : ObjectId("5cd9a12fb50a6c6dd317ad9a"), "ClientDetails" : [ { "ClientId" : 110, "ClientName" : "David" }, { "ClientId" : 112, "ClientName" : "Mike" } ] }

결과를 보면 ClientId가 110인 요소(David)를 포함한 문서 전체가 그대로 반환된 것을 확인할 수 있습니다. 즉, 점 표기법은 조건에 맞는 하위 요소만 잘라내는 것이 아니라, 해당 요소를 담고 있는 부모 문서를 통째로 가져옵니다. 만약 일치하는 하위 요소만 추출하고 싶다면 $elemMatch 연산자와 프로젝션(projection)을 함께 활용하면 됩니다.