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

MongoDB 배열 내부 쿼리와 $exists 연산자로 문서 개수 세는 방법

MongoDB에서 배열 내부 쿼리로 카운트 구하는 방법

MongoDB에서 배열 안에 포함된 필드를 대상으로 쿼리를 실행하고, 해당 필드의 존재 여부를 확인한 뒤 일치하는 문서의 개수(카운트)를 구하려면 $exists 연산자를 활용하면 됩니다. 이 글에서는 실제 예제를 통해 그 과정을 단계별로 살펴보겠습니다.

1. 샘플 컬렉션 생성하기

먼저 demo296이라는 컬렉션을 만들고 문서들을 삽입합니다. 각 문서는 details라는 배열 필드를 가지며, 배열 요소마다 서로 다른 하위 필드가 존재한다는 점이 핵심입니다.

> db.demo296.insertOne(
...   {
...      "id":101,
...      "Name":"Chris",
...      "details":[
...         {
...            SubjectId:[101,103],
...            "SubjectName":["MySQL","MongoDB"]
...         },
...         {
...            SubjectId:[102,104],
...            "SubjectName":["Java","C"]
...         }
...      ]
...   }
...);
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e4d51715d93261e4bc9ea3b")
}
> db.demo296.insertOne(
...{
...   "id":102,
...   "Name":"David",
...   "details":[
...      {
...         SubjectId:[110,113]
...
...      },
...      {
...         SubjectId:[112,114]
...
...      }
...   ]
...}
...);
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e4d519b5d93261e4bc9ea3c")
}
> db.demo296.insertOne(
...   {
...      "id":103,
...      "Name":"Bob",
...      "details":[
...         {
...            "SubjectName":["C++","Python"]
...         },
...         {
...            "SubjectName":["Spring","Hibernate"]
...         }
...      ]
...   }
...);
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e4d52315d93261e4bc9ea3d")
}

위 예제에서 첫 번째 문서(Chris)와 세 번째 문서(Bob)는 SubjectName 필드를 가지고 있지만, 두 번째 문서(David)는 SubjectId만 존재하고 SubjectName은 없습니다.

2. 저장된 전체 문서 확인하기

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

> db.demo296.find();

위 명령을 실행하면 다음과 같은 결과가 출력됩니다.

{
   "_id" : ObjectId("5e4d51715d93261e4bc9ea3b"), "id" : 101, "Name" : "Chris", "details" : [
      { "SubjectId" : [ 101, 103 ], "SubjectName" : [ "MySQL", "MongoDB" ] },
      { "SubjectId" : [ 102, 104 ], "SubjectName" : [ "Java", "C" ] }
   ]
}
{
   "_id" : ObjectId("5e4d519b5d93261e4bc9ea3c"), "id" : 102, "Name" : "David", "details" : [
      { "SubjectId" : [ 110, 113 ] }, { "SubjectId" : [ 112, 114 ] }
   ]
}
{
   "_id" : ObjectId("5e4d52315d93261e4bc9ea3d"), "id" : 103, "Name" : "Bob", "details" : [
      { "SubjectName" : [ "C++", "Python" ] }, { "SubjectName" : [ "Spring", "Hibernate" ] }
   ] 
}

3. $exists로 배열 내부 필드 존재 여부 확인 후 카운트 구하기

배열 내부의 특정 필드가 존재하는 문서만 골라 개수를 세려면, 점 표기법(dot notation)으로 details.SubjectName 경로를 지정하고 $exists: true 조건을 걸어준 뒤 count() 메서드를 호출하면 됩니다.

> db.demo296.count( { 'details.SubjectName': {$exists: true }} );

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

2

결과값이 2인 이유는 전체 3개의 문서 중 SubjectName 필드를 실제로 가지고 있는 문서가 Chris와 Bob 단 두 개뿐이기 때문입니다. David의 문서에는 SubjectId만 존재하므로 카운트에서 제외됩니다.

정리

이처럼 MongoDB에서는 점 표기법과 $exists 연산자를 조합하면 배열 내부의 중첩된 필드까지 손쉽게 검색할 수 있습니다. 여기에 count() 메서드를 함께 사용하면 조건에 맞는 문서의 개수도 간단하게 집계할 수 있습니다. 참고로 최신 버전의 MongoDB에서는 count() 대신 countDocuments() 또는 estimatedDocumentCount() 사용이 권장되므로, 실무 환경에서는 이를 활용하는 것이 좋습니다.