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

MongoDB에서 쿼리를 동적으로 생성하는 방법 완벽 가이드

MongoDB에서는 검색 조건이 상황에 따라 달라지는 경우가 많습니다. 이럴 때 쿼리를 고정된 형태로 작성하는 대신 동적으로 생성하면 훨씬 유연하게 데이터를 조회할 수 있습니다. 이 글에서는 JavaScript 함수를 활용해 MongoDB 쿼리를 동적으로 빌드하는 방법을 단계별로 살펴보겠습니다.

1. 샘플 컬렉션 생성하기

먼저 실습에 사용할 문서(document)들을 포함한 컬렉션을 생성합니다. insertOne() 메서드를 사용해 세 개의 문서를 삽입해 보겠습니다.

> db.dynamicQueryDemo.insertOne({"Name":"John","Subject":["MongoDB","MySQL"]});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cef5c5def71edecf6a1f69a")
}
> db.dynamicQueryDemo.insertOne({"Name":"John","Subject":["C","C++"]});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cef5c73ef71edecf6a1f69b")
}
> db.dynamicQueryDemo.insertOne({"Name":"John","Subject":["MongoDB","Java"]});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cef5c8bef71edecf6a1f69c")
}

2. 저장된 문서 확인하기

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

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

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

{
    "_id" : ObjectId("5cef5c5def71edecf6a1f69a"),
    "Name" : "John",
    "Subject" : [
        "MongoDB",
        "MySQL"
    ]
}
{
    "_id" : ObjectId("5cef5c73ef71edecf6a1f69b"),
    "Name" : "John",
    "Subject" : [
        "C",
        "C++"
    ]
}
{
    "_id" : ObjectId("5cef5c8bef71edecf6a1f69c"),
    "Name" : "John",
    "Subject" : [
        "MongoDB",
        "Java"
    ]
}

3. 쿼리를 동적으로 빌드하는 함수 작성하기

이제 핵심 단계입니다. 전달받은 과목(subject) 배열의 길이에 따라 조건 객체를 다르게 구성하는 함수를 작성합니다. 배열이 비어 있으면 $nin(포함하지 않음) 연산자를, 값이 있으면 $in(포함함) 연산자를 사용하도록 분기 처리합니다.

> function findDocument(subject) {
    var find = {};
    if (subject.length == 0)
       find["$nin"] = subject;
    else
       find["$in"] = subject;
    return find;
}
> var sub = ["MySQL","MongoDB"];
> var myDoc = findDocument(sub);

> db.dynamicQueryDemo.aggregate([{
    $match: {
       "Subject": myDoc,
    }
}]);

여기서 사용된 주요 개념은 다음과 같습니다.

  • $in 연산자: 지정한 배열의 값 중 하나라도 포함하는 문서를 조회합니다.
  • $nin 연산자: 지정한 배열의 값을 포함하지 않는 문서를 조회합니다.
  • aggregate의 $match 단계: 주어진 조건에 맞는 문서만 필터링하여 통합 파이프라인으로 전달합니다.

4. 실행 결과 확인하기

위 집계 쿼리를 실행하면 ["MySQL", "MongoDB"] 배열에 해당하는 과목을 하나 이상 포함한 문서만 반환됩니다.

{ "_id" : ObjectId("5cef5c5def71edecf6a1f69a"), "Name" : "John", "Subject" : [ "MongoDB", "MySQL" ] }
{ "_id" : ObjectId("5cef5c8bef71edecf6a1f69c"), "Name" : "John", "Subject" : [ "MongoDB", "Java" ] }

결과를 보면 두 번째 문서(C, C++)는 조건에 맞지 않아 제외된 것을 확인할 수 있습니다.

마무리

이처럼 간단한 JavaScript 함수 하나로 MongoDB 쿼리 조건을 동적으로 구성할 수 있습니다. 검색 조건이 런타임에 결정되는 웹 애플리케이션이나 API를 개발할 때 이 패턴을 활용하면 코드의 재사용성과 유연성을 크게 높일 수 있습니다. 필요에 따라 $and, $or 같은 논리 연산자를 추가로 조합하면 더욱 복잡한 동적 쿼리도 손쉽게 만들 수 있습니다.