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"인 문서가 모두 반환되므로 주의해야 합니다.