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

MongoDB에서 여러 배열 요소 조건으로 문서를 필터링하는 방법 ($elemMatch 활용)

MongoDB에서 배열 필드 내부의 여러 조건을 동시에 만족하는 단일 요소를 기준으로 문서를 필터링하려면 $elemMatch 연산자를 사용해야 합니다. 일반적인 쿼리 조건은 각 조건이 서로 다른 배열 요소에 걸쳐 매칭될 수 있지만, $elemMatch는 하나의 배열 요소 안에서 모든 조건이 동시에 충족되도록 보장합니다.

예제 컬렉션 생성

먼저 직원 정보를 담은 배열을 포함하는 문서들로 컬렉션을 생성해 보겠습니다.

> db.demo87.insertOne(
...     {
...        id:101,
...        "Details": [
...           {
...              "EmployeeName": "Chris",
...              "Salary": 45000
...           },
...           {
...              "EmployeeName": "David",
...              "Salary": 50000
...           }
...       ]
...    }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e2c113871bf0181ecc422ab")
}
> db.demo87.insertOne(
... {
...    id:102,
...    "Details": [
...       {
...          "EmployeeName": "Chris",
...          "Salary": 65000
...       },
...       {
...          "EmployeeName": "Mike",
...          "Salary": 100000
...       }
...    ]
... }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e2c114371bf0181ecc422ac")
}

위 명령으로 두 개의 문서가 삽입되었습니다. 첫 번째 문서(id: 101)에는 Chris(45000)와 David(50000)가 포함되어 있고, 두 번째 문서(id: 102)에는 Chris(65000)와 Mike(100000)가 포함되어 있습니다.

컬렉션의 전체 문서 조회

find() 메서드를 사용하여 컬렉션의 모든 문서를 확인해 보겠습니다.

> db.demo87.find();

이 명령은 다음과 같은 결과를 출력합니다.

{
    "_id" : ObjectId("5e2c113871bf0181ecc422ab"), "id" : 101, "Details" : [
       { "EmployeeName" : "Chris", "Salary" : 45000 },
       { "EmployeeName" : "David", "Salary" : 50000 }
    ]
}
{
    "_id" : ObjectId("5e2c114371bf0181ecc422ac"), "id" : 102, "Details" : [
       { "EmployeeName" : "Chris", "Salary" : 65000 },
       { "EmployeeName" : "Mike", "Salary" : 100000 }
    ]
}

$elemMatch로 여러 배열 요소 조건 필터링하기

이제 $elemMatch를 사용하여 동일한 배열 요소 내에서 EmployeeName이 'Chris'이고 Salary가 65000인 경우만 필터링하는 쿼리를 살펴보겠습니다.

> db.demo87.find({ Details: { $elemMatch: { "EmployeeName": 'Chris', "Salary": 65000 }}});

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

{
    "_id" : ObjectId("5e2c114371bf0181ecc422ac"), "id" : 102, "Details" : [
       { "EmployeeName" : "Chris", "Salary" : 65000 },
       { "EmployeeName" : "Mike", "Salary" : 100000 }
    ] 
}

결과 분석

두 문서 모두 'Chris'라는 이름의 직원을 포함하고 있지만, Salary가 65000인 Chris는 두 번째 문서(id: 102)에만 존재합니다. 따라서 $elemMatch는 정확히 해당 문서만 반환했습니다.

만약 { "Details.EmployeeName": 'Chris', "Details.Salary": 65000 }처럼 점 표기법(dot notation)으로 쿼리했다면, EmployeeName과 Salary 조건이 서로 다른 배열 요소에서 각각 매칭될 수 있어 의도와 다른 결과가 나올 수 있습니다. 이것이 바로 $elemMatch를 사용해야 하는 핵심 이유입니다.