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

MongoDB에서 배열의 모든 객체가 특정 값을 가지는 문서 찾는 방법

MongoDB에서 배열의 모든 객체가 특정 값을 가지는 문서 찾는 방법

MongoDB에서 배열 필드에 포함된 모든 객체가 특정 값을 만족하는 문서만 조회하려면 $not 연산자와 $elemMatch 연산자를 조합하면 됩니다. 이 글에서는 실제 예제를 통해 단계별로 그 방법을 살펴보겠습니다.

1단계: 샘플 컬렉션 생성하기

먼저 문서가 담긴 컬렉션을 생성합니다. 첫 번째 문서는 배열 요소 중 일부만 "Active" 상태이고, 두 번째 문서는 모든 요소가 "Active" 상태입니다.

> db.demo74.insertOne(
... {
...    StudentName: "Chris",
...    StudentDetails: [{
...       "Subject": "MongoDB",
...       "isRegular": "Active"
...    }, {
...       "Subject": "MongoDB",
...       "isRegular": "InActive"
...    }, {
...       "Subject": "MongoDB",
...       "isRegular": "InActive"
...    }]
... }
... );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e29c6b671bf0181ecc4226f")
}
> db.demo74.insertOne(
... {
...    StudentName: "David",
...    StudentDetails: [{
...       "Subject": "MongoDB",
...       "isRegular": "Active"
...    }, {
...       "Subject": "MongoDB",
...       "isRegular": "Active"
...    }, {
...       "Subject": "MongoDB",
...       "isRegular": "Active"
...    }]
... }
... );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e29c6b771bf0181ecc42270")
}

2단계: 저장된 전체 문서 확인하기

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

> db.demo74.find();

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

{
   "_id" : ObjectId("5e29c6b671bf0181ecc4226f"),
   "StudentName" : "Chris",
   "StudentDetails" : [
      { "Subject" : "MongoDB", "isRegular" : "Active" },
      { "Subject" : "MongoDB", "isRegular" : "InActive" },
      { "Subject" : "MongoDB", "isRegular" : "InActive" }
   ]
}
{
   "_id" : ObjectId("5e29c6b771bf0181ecc42270"),
   "StudentName" : "David",
   "StudentDetails" : [
      { "Subject" : "MongoDB", "isRegular" : "Active" },
      { "Subject" : "MongoDB", "isRegular" : "Active" },
      { "Subject" : "MongoDB", "isRegular" : "Active" }
   ]
}

3단계: 배열의 모든 객체가 특정 값을 가지는 문서 조회하기

다음은 배열 내 모든 객체isRegular 값이 "Active"인 문서만 찾는 쿼리입니다.

> db.demo74.find({
...    "StudentDetails": {
...       "$not": {
...          "$elemMatch": { "isRegular": { $ne: "Active" } }
...       }
...    },
...    "StudentDetails.isRegular": "Active"
... }).pretty();

위 쿼리를 실행하면 다음과 같은 결과를 얻을 수 있습니다.

{
   "_id" : ObjectId("5e29c6b771bf0181ecc42270"),
   "StudentName" : "David",
   "StudentDetails" : [
      {
         "Subject" : "MongoDB",
         "isRegular" : "Active"
      },
      {
         "Subject" : "MongoDB",
         "isRegular" : "Active"
      },
      {
         "Subject" : "MongoDB",
         "isRegular" : "Active"
      }
   ]
}

쿼리 동작 원리

이 쿼리가 의도대로 동작하는 이유는 각 연산자의 역할 때문입니다.

  • $elemMatch: 배열 요소 중 하나라도 지정한 조건과 일치하는지 검사합니다.
  • $not: $elemMatch의 결과를 반전시킵니다. 즉, isRegular가 "Active"가 아닌 요소가 단 하나도 없는 문서만 통과시킵니다.
  • "StudentDetails.isRegular": "Active": 최소 한 개 이상의 요소가 "Active"인지 확인하여, 빈 배열이거나 해당 필드가 아예 없는 문서를 걸러냅니다.

두 조건을 결합하면 "배열의 모든 객체가 특정 값을 가지는 문서"만 정확하게 조회할 수 있습니다. 참고로 단순히 {"StudentDetails.isRegular": "Active"} 조건만 사용하면 요소 중 하나라도 "Active"인 문서가 모두 반환되므로 주의해야 합니다.