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

MongoDB 집계(Aggregation)에서 $match와 $and로 여러 값 모두 일치시키기

MongoDB에서 문서의 모든 필드 값이 조건과 일치하는지 확인하려면 집계(Aggregation) 파이프라인에서 $match 연산자와 $and 연산자를 함께 사용하면 됩니다. 이 글에서는 중첩된 구조를 가진 컬렉션을 대상으로 여러 조건을 동시에 만족하는 문서를 조회하는 방법을 단계별로 살펴보겠습니다.

1. 샘플 컬렉션 생성하기

먼저 insertOne() 메서드를 사용하여 문서가 포함된 컬렉션을 생성합니다. 아래 예제는 중첩 객체 구조를 가진 문서를 삽입하는 코드입니다.

> db.demo574.insertOne(
...     {
...        "details1": {
...           "details2": {
...              "dueDate": new ISODate("2020-01-10"),
...              "Name": "Chris",
...
...              "UserInformation": {
...                 "Name": "John",
...                 "Marks": 78
...              },
...              CountryName:"US"
...           },
...           id:101
...        }
...    }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e9167f3581e9acd78b427f6")
}

2. 저장된 문서 확인하기

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

> db.demo574.find();

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

{
    "_id" : ObjectId("5e9167f3581e9acd78b427f6"), "details1" :
    { "details2" : { "dueDate" : ISODate("2020-01-10T00:00:00Z"), "Name" : "Chris", "UserInformation" :
    { "Name" : "John", "Marks" : 78 }, "CountryName" : "US" }, "id" : 101 }
}

3. $match와 $and를 활용한 집계 쿼리

이제 $match$and를 결합하여 여러 조건을 동시에 만족하는 문서만 필터링하는 집계 쿼리를 작성해 보겠습니다. 아래 쿼리는 세 가지 조건, 즉 details1.id가 101이고, UserInformation.Name이 'John'이며, Name이 'Chris'인 문서를 찾습니다.

> db.demo574.aggregate({
...     $match: {
...        $and: [
...           {"details1.id": 101},
...           {"details1.details2.UserInformation.Name": 'John'},
...           {"details1.details2.Name": 'Chris'}
...        ]
...     }
... }
... );

쿼리 실행 결과, 세 가지 조건을 모두 충족하는 문서가 반환됩니다.

{
    "_id" : ObjectId("5e9167f3581e9acd78b427f6"), "details1" :
    { "details2" : { "dueDate" : ISODate("2020-01-10T00:00:00Z"), "Name" : "Chris", "UserInformation" :
    { "Name" : "John", "Marks" : 78 }, "CountryName" : "US" }, "id" : 101 } 
}

정리

MongoDB의 집계 파이프라인에서 $match 안에 $and 연산자를 사용하면 중첩된 필드를 포함한 여러 조건을 동시에 검사할 수 있습니다. 배열 형태로 조건을 나열하면 해당 조건들이 모두 참(true)일 때만 문서가 결과에 포함되므로, 복잡한 필터링 로직도 간결하게 표현할 수 있다는 점이 큰 장점입니다.