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

MongoDB에서 배열 내부의 여러 조건을 한 번에 일치시키는 방법 – $elemMatch 완벽 가이드

MongoDB에서 배열 안의 요소들이 여러 조건을 동시에 만족하는 문서를 찾고 싶다면, 단순한 쿼리만으로는 부족할 수 있습니다. 이럴 때 유용하게 사용되는 것이 바로 애그리게이션 프레임워크(Aggregation Framework)$elemMatch 연산자입니다.

1. 테스트용 컬렉션 생성하기

먼저 예제로 사용할 컬렉션을 만들고 문서를 삽입해 보겠습니다. 직원 정보를 담은 EmployeeDetails 배열 필드를 포함한 문서 두 개를 추가합니다.

> db.matchMultipleCriteriaDemo.insertOne({
    "EmployeeDetails": [
       {"EmployeeName": "Chris", "Salary": 45000, "Language":"Java"},
       {"EmployeeName": "Robert", "Salary": 41000, "Language":"Python"}
    ]
});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cea3bf0ef71edecf6a1f689")
}
> db.matchMultipleCriteriaDemo.insertOne({
    "EmployeeDetails": [
       {"EmployeeName": "David", "Salary": 55000, "Language":"C++"},
       {"EmployeeName": "Bob", "Salary": 61000, "Language":"C"}
    ]
});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cea3bf1ef71edecf6a1f68a")
}

2. find() 메서드로 전체 문서 확인하기

삽입된 데이터가 올바른지 find() 메서드를 사용해 컬렉션의 모든 문서를 조회해 보겠습니다.

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

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

{
    "_id" : ObjectId("5cea3bf0ef71edecf6a1f689"),
    "EmployeeDetails" : [
        {
            "EmployeeName" : "Chris",
            "Salary" : 45000,
            "Language" : "Java"
        },
        {
            "EmployeeName" : "Robert",
            "Salary" : 41000,
            "Language" : "Python"
        }
    ]
}
{
    "_id" : ObjectId("5cea3bf1ef71edecf6a1f68a"),
    "EmployeeDetails" : [
        {
            "EmployeeName" : "David",
            "Salary" : 55000,
            "Language" : "C++"
        },
        {
            "EmployeeName" : "Bob",
            "Salary" : 61000,
            "Language" : "C"
        }
    ]
}

3. $elemMatch로 배열 내 여러 조건 일치시키기

이제 핵심인 $elemMatch 연산자를 살펴보겠습니다. 아래 쿼리는 애그리게이션의 $match 스테이지와 함께 사용하여, EmployeeDetails 배열 내 단일 요소가 '이름이 Bob이면서 언어가 C'라는 두 조건을 모두 충족하는지 확인합니다.

> db.matchMultipleCriteriaDemo.aggregate({ "$match": { "EmployeeDetails": { "$elemMatch": { "EmployeeName": "Bob", "Language":"C" } } }} ).pretty();

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

{
    "_id" : ObjectId("5cea3bf1ef71edecf6a1f68a"),
    "EmployeeDetails" : [
        {
            "EmployeeName" : "David",
            "Salary" : 55000,
            "Language" : "C++"
        },
        {
            "EmployeeName" : "Bob",
            "Salary" : 61000,
            "Language" : "C"
        }
    ]
}

정리 및 핵심 포인트

$elemMatch의 가장 큰 장점은 배열 내 하나의 요소가 모든 조건을 동시에 만족해야만 해당 문서를 반환한다는 점입니다.

예를 들어, 어떤 요소는 이름이 'Bob'이고 다른 요소는 언어가 'C'라면, 일반적인 쿼리 방식으로는 두 조건이 서로 다른 요소에 걸쳐 있어도 문서가 매칭될 수 있습니다. 하지만 $elemMatch를 사용하면 같은 요소 안에서 두 조건이 모두 참일 때만 결과에 포함되므로, 훨씬 정확한 검색이 가능합니다.

배열 필드에 복합 조건으로 쿼리할 때는 $elemMatch를 사용하는 것이 실수를 줄이고 의도한 결과를 얻는 가장 확실한 방법입니다.