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

MongoDB에서 배열의 모든 요소가 특정 값과 일치하는 문서 찾는 방법

MongoDB에서 배열 필드를 다룰 때, 배열 내 모든 요소가 특정 값과 일치하는 문서만 조회해야 하는 경우가 있습니다. 이럴 때 $elemMatch 연산자를 $not, $ne와 함께 조합하면 원하는 결과를 얻을 수 있습니다.

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

> db.demo15.insertOne({"Details":[{"Score":56},{"Score":78}]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e0f7806d7df943a7cec4fab")
}
> db.demo15.insertOne({"Details":[{"Score":86},{"Score":86}]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e0f7817d7df943a7cec4fac")
}
> db.demo15.insertOne({"Details":[{"Score":97},{"Score":85}]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e0f7823d7df943a7cec4fad")
}

위 코드에서는 세 개의 문서를 삽입했습니다. 각 문서는 Details라는 배열 안에 Score 객체들을 포함하고 있습니다.

컬렉션의 전체 문서 확인하기

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

> db.demo15.find();

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

{ "_id" : ObjectId("5e0f7806d7df943a7cec4fab"), "Details" : [ { "Score" : 56 }, { "Score" : 78 } ] }
{ "_id" : ObjectId("5e0f7817d7df943a7cec4fac"), "Details" : [ { "Score" : 86 }, { "Score" : 86 } ] }
{ "_id" : ObjectId("5e0f7823d7df943a7cec4fad"), "Details" : [ { "Score" : 97 }, { "Score" : 85 } ] }

배열의 모든 요소가 특정 값인 문서 조회하기

이제 배열의 모든 요소가 특정 값(여기서는 86)을 가지는 문서를 찾아보겠습니다. 핵심 아이디어는 다음과 같습니다.

  • $exists: true로 해당 필드가 존재하는지 먼저 확인합니다.
  • $not$elemMatch를 조합하여 "Score가 86이 아닌 요소가 하나라도 있는 경우"를 제외합니다.
> db.demo15.find({
...    "Details.Score" : {
...       $exists : true
...    },
...    "Details" : {
...       $not : {
...          $elemMatch : {
...             "Score" : {
...                $ne : 86
...             }
...          }
...       }
...    }
... });

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

{ "_id" : ObjectId("5e0f7817d7df943a7cec4fac"), "Details" : [ { "Score" : 86 }, { "Score" : 86 } ] }

동작 원리 정리

이 쿼리가 의도대로 작동하는 이유를 살펴보면 다음과 같습니다.

  • $elemMatch({ Score: { $ne: 86 } })는 배열 안에 86이 아닌 값이 하나라도 존재하는 문서를 매칭합니다.
  • 이 조건을 $not으로 감싸면, 즉 "86이 아닌 요소가 없는 문서", 곧 모든 요소가 86인 문서만 최종적으로 선택됩니다.
  • 따라서 두 번째 문서(Score가 각각 86, 86)만 결과로 반환됩니다.

이처럼 $not$elemMatch를 함께 사용하면 복잡한 배열 조건도 간결하게 처리할 수 있습니다. 배열 요소 전체가 특정 조건을 만족하는지 검사해야 할 때 유용하게 활용해 보시기 바랍니다.