Database/NoSQL

[MongoDB] 몽고DB에서 문서를 쿼리하고 필터링하는 방법, document query, filter

코딩for 2022. 10. 25. 10:27
반응형

MongoDB에서 문서를 쿼리하고 필터링하는 방법(번역)

 

Querying MongoDB documents | Prisma's Data Guide

In this guide, we'll cover how to query and retrieve documents in MongoDB.

www.prisma.io

 

 

기본 쿼리 구문

이제 문서가 포함된 두 개의 컬렉션이 있으므로 개별 문서 또는 문서 그룹을 검색하는 방법을 실험할 수 있습니다. MongoDB에서 문서를 가져오는 주요 방법은 find()해당 컬렉션의 메서드를 호출하는 것입니다.

예를 들어 컬렉션에서 모든 문서를 수집하려면 인수 없이 students호출할 수 있습니다 .find()

db.students.find()
{ "_id" : ObjectId("60e8743b4655cbf49ff7cb83"), "first_name" : "Ashley", "last_name" : "Jenkins", "dob" : ISODate("2003-01-08T00:00:00Z"), "grade_level" : 8 }
{ "_id" : ObjectId("60e875d54655cbf49ff7cb84"), "first_name" : "Brian", "last_name" : "McMantis", "dob" : ISODate("2010-09-18T00:00:00Z"), "grade_level" : 2 }
{ "_id" : ObjectId("60e875d54655cbf49ff7cb85"), "first_name" : "Leah", "last_name" : "Drake", "dob" : ISODate("2009-10-03T00:00:00Z") }
{ "_id" : ObjectId("60e877914655cbf49ff7cb86"), "first_name" : "Naomi", "last_name" : "Pyani" }
{ "_id" : ObjectId("60e8792d4655cbf49ff7cb87"), "first_name" : "Jasmine", "last_name" : "Took", "dob" : ISODate("2011-04-11T00:00:00Z") }
{ "_id" : ObjectId("60e8792d4655cbf49ff7cb88"), "first_name" : "Michael", "last_name" : "Rodgers", "dob" : ISODate("2008-02-25T00:00:00Z"), "grade_level" : 6 }
{ "_id" : ObjectId("60e8792d4655cbf49ff7cb89"), "first_name" : "Toni", "last_name" : "Fowler" }

출력을 더 읽기 쉽게 만들기 위해 다음과 같이 pretty()메서드 를 연결할 수도 있습니다 find().

db.<collection>.find().pretty()
{
        "_id" : ObjectId("60e8743b4655cbf49ff7cb83"),
        "first_name" : "Ashley",
        "last_name" : "Jenkins",
        "dob" : ISODate("2003-01-08T00:00:00Z"),
        "grade_level" : 8
}
{
        "_id" : ObjectId("60e875d54655cbf49ff7cb84"),
        "first_name" : "Brian",
        "last_name" : "McMantis",
        "dob" : ISODate("2010-09-18T00:00:00Z"),
        "grade_level" : 2
}
{
        "_id" : ObjectId("60e875d54655cbf49ff7cb85"),
        "first_name" : "Leah",
        "last_name" : "Drake",
        "dob" : ISODate("2009-10-03T00:00:00Z")
}
{
        "_id" : ObjectId("60e877914655cbf49ff7cb86"),
        "first_name" : "Naomi",
        "last_name" : "Pyani"
}
{
        "_id" : ObjectId("60e8792d4655cbf49ff7cb87"),
        "first_name" : "Jasmine",
        "last_name" : "Took",
        "dob" : ISODate("2011-04-11T00:00:00Z")
}
{
        "_id" : ObjectId("60e8792d4655cbf49ff7cb88"),
        "first_name" : "Michael",
        "last_name" : "Rodgers",
        "dob" : ISODate("2008-02-25T00:00:00Z"),
       "grade_level" : 6
}
{
        "_id" : ObjectId("60e8792d4655cbf49ff7cb89"),
        "first_name" : "Toni",
        "last_name" : "Fowler"
}

_id각 문서에 필드가 추가된 것을 확인할 수 있습니다 . MongoDB는 _id컬렉션의 각 문서에 대해 고유해야 합니다. 객체 생성 시 제공하지 않으면 자동으로 추가됩니다. 이 ID를 사용하여 단일 개체를 안정적으로 검색할 수 있습니다.

db.student.find(
    {
        _id : ObjectId("60e8792d4655cbf49ff7cb89")
    }
)
{ "_id" : ObjectId("60e8792d4655cbf49ff7cb89"), "first_name" : "Toni", "last_name" : "Fowler" }

같음으로 결과 필터링

찾고자 하는 필드 및 값 쌍을 지정하는 개체를 제공하여 동일한지 확인하여 결과를 필터링할 수 있습니다.

예를 들어 다음 쿼리를 사용하여 "Brian"이라는 학생 목록을 얻을 수 있습니다.

db.students.find({first_name: "Brian"})
{ "_id" : ObjectId("60e875d54655cbf49ff7cb84"), "first_name" : "Brian", "last_name" : "McMantis", "dob" : ISODate("2010-09-18T00:00:00Z"), "grade_level" : 2 }

필드 값 표기법을 사용하여 지정하는 모든 품질은 동등 쿼리로 해석됩니다. 여러 필드를 제공하는 경우 문서가 일치하려면 모든 값이 동일해야 합니다.

예를 들어, 이전과 동일한 동등 일치를 수행하지만 grade_level3으로 포함하면 문서가 반환되지 않습니다.

db.students.find({first_name: "Brian", grade_level: 3})

비교 연산자를 사용한 필터링

단순 동등 필터링은 유용하지만 표현할 수 있는 범위가 상당히 제한적입니다. 다른 유형의 비교를 위해 MongoDB는 다른 방식으로 쿼리할 수 있도록 다양한 비교 연산자를 제공합니다.

사용 가능한 비교 연산자의 기본 기능은 다른 프로그래밍 언어로 작업하는 경우 상당히 익숙할 것입니다. 대부분의 연산자는 다음과 같이 연산자와 비교할 값이 포함된 필드 이름에 개체를 전달하여 작동합니다.

<field_name>: { <operator>: <value_to_compare_against> }

동일

$eq연산자는 제공된 값과 문서의 필드 값이 같은지 확인합니다 . 대부분의 경우 위에서 사용한 동등 비교와 동일한 기능을 합니다.

예를 들어, "Brian"이라는 학생에 대해 다음을 입력하여 동일한 쿼리를 표현할 수 있습니다.

db.students.find({
    first_name: { $eq: "Brian" }
})
{ "_id" : ObjectId("60e875d54655cbf49ff7cb84"), "first_name" : "Brian", "last_name" : "McMantis", "dob" : ISODate("2010-09-18T00:00:00Z"), "grade_level" : 2 }

같지 않음

제공된 값과 같지 않은 문서를 쿼리할 수도 있습니다 . 이에 대한 연산자는 입니다 $ne.

예를 들어 집합이 있는 모든 학생을 찾는 한 가지 방법 grade_level은 필드가 다음으로 설정되지 않은 항목을 검색하는 것입니다 null.

db.students.find({
    grade_level: { $ne: null }
})
{ "_id" : ObjectId("60e8743b4655cbf49ff7cb83"), "first_name" : "Ashley", "last_name" : "Jenkins", "dob" : ISODate("2003-01-08T00:00:00Z"), "grade_level" : 8 }
{ "_id" : ObjectId("60e875d54655cbf49ff7cb84"), "first_name" : "Brian", "last_name" : "McMantis", "dob" : ISODate("2010-09-18T00:00:00Z"), "grade_level" : 2 }
{ "_id" : ObjectId("60e8792d4655cbf49ff7cb88"), "first_name" : "Michael", "last_name" : "Rodgers", "dob" : ISODate("2008-02-25T00:00:00Z"), "grade_level" : 6 }

보다 큰

연산자를 사용하면 필드 값 이 $gt제공된 참조 번호보다 큰 문서를 쿼리할 수 있습니다.

예를 들어, 6학년보다 높은 학년의 학생에 대한 모든 기록을 찾으려면 다음을 입력할 수 있습니다.

db.students.find({
    grade_level: { $gt: 6 }
})
{ "_id" : ObjectId("60e8743b4655cbf49ff7cb83"), "first_name" : "Ashley", "last_name" : "Jenkins", "dob" : ISODate("2003-01-08T00:00:00Z"), "grade_level" : 8 }

크거나 같음

연산자는 제공된 $gte값과 같거나 큰 값에 대한 쿼리를 표현합니다.

위와 동일한 쿼리를 수행할 수 있지만 다음을 입력하여 6학년 학생을 추가로 포함할 수 있습니다.

db.students.find({
    grade_level: { $gte: 6 }
})
{ "_id" : ObjectId("60e8743b4655cbf49ff7cb83"), "first_name" : "Ashley", "last_name" : "Jenkins", "dob" : ISODate("2003-01-08T00:00:00Z"), "grade_level" : 8 }
{ "_id" : ObjectId("60e8792d4655cbf49ff7cb88"), "first_name" : "Michael", "last_name" : "Rodgers", "dob" : ISODate("2008-02-25T00:00:00Z"), "grade_level" : 6 }

미만

연산자를 사용하여 $lt제공된 값보다 작은 값을 찾습니다.

예를 들어 다음을 입력하여 2010년 1월 1일 이전의 생년월일을 볼 수 있습니다.

db.students.find({
    dob: { $lt: new Date("January 1, 2010") }
})
{ "_id" : ObjectId("60e8743b4655cbf49ff7cb83"), "first_name" : "Ashley", "last_name" : "Jenkins", "dob" : ISODate("2003-01-08T00:00:00Z"), "grade_level" : 8 }
{ "_id" : ObjectId("60e875d54655cbf49ff7cb85"), "first_name" : "Leah", "last_name" : "Drake", "dob" : ISODate("2009-10-03T00:00:00Z") }
{ "_id" : ObjectId("60e8792d4655cbf49ff7cb88"), "first_name" : "Michael", "last_name" : "Rodgers", "dob" : ISODate("2008-02-25T00:00:00Z"), "grade_level" : 6 }

이하

연산자는 제공된 $lte참조보다 작거나 같은 값을 확인합니다.

예를 들어 6학년 이하의 학생을 찾으려면 다음을 입력합니다.

db.students.find({
    grade_level: { $lte: 6 }
})
{ "_id" : ObjectId("60e875d54655cbf49ff7cb84"), "first_name" : "Brian", "last_name" : "McMantis", "dob" : ISODate("2010-09-18T00:00:00Z"), "grade_level" : 2 }
{ "_id" : ObjectId("60e8792d4655cbf49ff7cb88"), "first_name" : "Michael", "last_name" : "Rodgers", "dob" : ISODate("2008-02-25T00:00:00Z"), "grade_level" : 6 }

값 그룹 중 하나와 일치

연산자 는 항등 연산자 $in처럼 작동 $eq하지만 배열에 가능한 여러 값을 제공할 수 있습니다. 예를 들어 필드 값이 8인지 여부를 확인하는 대신 값이 다음 중 하나인지 확인할 수 있습니다 [8, 9, 10, 11].

연산자 는 $in정규식에서도 작동합니다. 예를 들어, 다음을 입력하여 이름이 'i' 또는 'e'로 끝나는 모든 학생을 찾을 수 있습니다.

db.students.find({
    first_name: {
        $in: [
            /i$/,
            /e$/
        ]
    }
})
{ "_id" : ObjectId("60e877914655cbf49ff7cb86"), "first_name" : "Naomi", "last_name" : "Pyani" }
{ "_id" : ObjectId("60e8792d4655cbf49ff7cb87"), "first_name" : "Jasmine", "last_name" : "Took", "dob" : ISODate("2011-04-11T00:00:00Z") }
{ "_id" : ObjectId("60e8792d4655cbf49ff7cb89"), "first_name" : "Toni", "last_name" : "Fowler" }

값 그룹과 일치하지 않음

위 절차의 역은 주어진 배열에 없는 값을 가진 모든 문서를 찾는 것입니다. 이에 대한 연산자는 입니다 $nin.

예를 들어, 다음 을 입력하여 이름이 'i' 또는 'e'로 끝나지 않는 모든 학생을 찾을 수 있습니다 .

db.students.find({
    first_name: {
        $nin: [
            /i$/,
            /e$/
        ]
    }
})
{ "_id" : ObjectId("60e8743b4655cbf49ff7cb83"), "first_name" : "Ashley", "last_name" : "Jenkins", "dob" : ISODate("2003-01-08T00:00:00Z"), "grade_level" : 8 }
{ "_id" : ObjectId("60e875d54655cbf49ff7cb84"), "first_name" : "Brian", "last_name" : "McMantis", "dob" : ISODate("2010-09-18T00:00:00Z"), "grade_level" : 2 }
{ "_id" : ObjectId("60e875d54655cbf49ff7cb85"), "first_name" : "Leah", "last_name" : "Drake", "dob" : ISODate("2009-10-03T00:00:00Z") }
{ "_id" : ObjectId("60e8792d4655cbf49ff7cb88"), "first_name" : "Michael", "last_name" : "Rodgers", "dob" : ISODate("2008-02-25T00:00:00Z"), "grade_level" : 6 }

논리 연산자를 사용한 필터링

더 복잡한 쿼리를 구성하려면 논리 연산자를 사용하여 여러 조건을 작성할 수 있습니다. 논리 연산자는 표현식의 객체나 표현식의 여러 객체를 포함하는 배열을 전달하여 작동합니다.

논리 AND 연산자

연산자는 전달 된 $and모든 표현식을 충족하는 결과를 반환합니다. 표현식 내의 모든 표현식은 $and반환되기 위해 true로 평가되어야 합니다.

$and예를 들어, 생년월일과 학년 수준이 모두 설정된 학생을 쿼리하는 데 사용할 수 있습니다 .

db.students.find({
    $and: [
        { dob: { $ne: null } },
        { grade_level: { $ne: null } }
    ]
})
{ "_id" : ObjectId("60e8743b4655cbf49ff7cb83"), "first_name" : "Ashley", "last_name" : "Jenkins", "dob" : ISODate("2003-01-08T00:00:00Z"), "grade_level" : 8 }
{ "_id" : ObjectId("60e875d54655cbf49ff7cb84"), "first_name" : "Brian", "last_name" : "McMantis", "dob" : ISODate("2010-09-18T00:00:00Z"), "grade_level" : 2 }
{ "_id" : ObjectId("60e8792d4655cbf49ff7cb88"), "first_name" : "Michael", "last_name" : "Rodgers", "dob" : ISODate("2008-02-25T00:00:00Z"), "grade_level" : 6 }
논리 OR 연산자

연산자 는 $or논리적 OR 계산을 수행합니다. 전달된 표현식 중 하나 라도 true 이면 전체 절이 충족된 것으로 간주됩니다.

예를 들어 이것을 사용하여 위에서 쿼리한 필드 중 하나가 누락된 학생을 쿼리할 수 있습니다.

db.students.find({
    $or: [
        { dob: { $eq: null } },
        { grade_level: { $eq: null } }
    ]
})
{ "_id" : ObjectId("60e875d54655cbf49ff7cb85"), "first_name" : "Leah", "last_name" : "Drake", "dob" : ISODate("2009-10-03T00:00:00Z") }
{ "_id" : ObjectId("60e877914655cbf49ff7cb86"), "first_name" : "Naomi", "last_name" : "Pyani" }
{ "_id" : ObjectId("60e8792d4655cbf49ff7cb87"), "first_name" : "Jasmine", "last_name" : "Took", "dob" : ISODate("2011-04-11T00:00:00Z") }
{ "_id" : ObjectId("60e8792d4655cbf49ff7cb89"), "first_name" : "Toni", "last_name" : "Fowler" }

논리 NOT 연산자

연산자는 전달된 표현식 의 $not값을 부정합니다. 는 단항 연산자 이기 때문에 표현식 배열에서 연산하는 대신 $not연산자 표현식을 직접 정의하는 단일 단일에서 연산합니다.

이것은 이전 연산자와 약간 다른 구문으로 이어집니다. 전체 필드 및 값 표현식을 래핑하는 대신 $not필드 일치 값의 일부로 사용 하고 전체 표현식이 아닌 연산자 표현식$not 만 인수로 사용합니다(필드 이름은 표현식 내부가 아니라 표현식 외부에 있습니다. ).

예를 들어, 입력하여 2010년 이전에 생일 이 없는 모든 학생을 찾을 수 있습니다 . dob이는 해당 필드가 전혀 설정되지 않은 문서도 반환하기 때문에 2010년 미만의 항목을 확인하는 것과 다릅니다 .

db.students.find({
    dob: {
        $not: { 
            $lt: new Date("January 1, 2010")
        }
    }
})
{ "_id" : ObjectId("60e875d54655cbf49ff7cb84"), "first_name" : "Brian", "last_name" : "McMantis", "dob" : ISODate("2010-09-18T00:00:00Z"), "grade_level" : 2 }
{ "_id" : ObjectId("60e877914655cbf49ff7cb86"), "first_name" : "Naomi", "last_name" : "Pyani" }
{ "_id" : ObjectId("60e8792d4655cbf49ff7cb87"), "first_name" : "Jasmine", "last_name" : "Took", "dob" : ISODate("2011-04-11T00:00:00Z") }
{ "_id" : ObjectId("60e8792d4655cbf49ff7cb89"), "first_name" : "Toni", "last_name" : "Fowler" }

논리 NOR 연산자

연산자 는 개체 배열을 사용 하여 해당 개체에 지정된 조건 $nor과 일치하지 않는 문서를 반환 합니다 . 모든 조건을 충족하지 못한 문서만 반환됩니다.

예를 들어, 성이 ''로 끝나지 않는 6학년이 아닌 학생의 문서를 검색하려면 다음을 입력할 수 있습니다.

db.students.find({
    $nor: [
        { grade_level: 6 },
        { last_name: /s$/ }
    ]
})
{ "_id" : ObjectId("60e875d54655cbf49ff7cb85"), "first_name" : "Leah", "last_name" : "Drake", "dob" : ISODate("2009-10-03T00:00:00Z") }
{ "_id" : ObjectId("60e877914655cbf49ff7cb86"), "first_name" : "Naomi", "last_name" : "Pyani" }
{ "_id" : ObjectId("60e8792d4655cbf49ff7cb87"), "first_name" : "Jasmine", "last_name" : "Took", "dob" : ISODate("2011-04-11T00:00:00Z") }
{ "_id" : ObjectId("60e8792d4655cbf49ff7cb89"), "first_name" : "Toni", "last_name" : "Fowler" }

존재 필터링

다른 테스트 방법은 필드 또는 값의 상태를 기반으로 합니다.

예를 들어 $exists필터는 문서 내에 필드가 있는지 확인합니다. 또는 로 설정 $exists하여 검색할 문서를 결정할 수 있습니다.truefalse

예를 들어, 학년 수준이 있는 학생 문서를 찾으려면 다음을 입력할 수 있습니다.

db.students.find({
    grade_level: { $exists: true }
})
{ "_id" : ObjectId("60e8743b4655cbf49ff7cb83"), "first_name" : "Ashley", "last_name" : "Jenkins", "dob" : ISODate("2003-01-08T00:00:00Z"), "grade_level" : 8 }
{ "_id" : ObjectId("60e875d54655cbf49ff7cb84"), "first_name" : "Brian", "last_name" : "McMantis", "dob" : ISODate("2010-09-18T00:00:00Z"), "grade_level" : 2 }
{ "_id" : ObjectId("60e8792d4655cbf49ff7cb88"), "first_name" : "Michael", "last_name" : "Rodgers", "dob" : ISODate("2008-02-25T00:00:00Z"), "grade_level" : 6 }

어레이 특성에 따른 필터링

보유하고 있는 배열을 통해 문서를 쿼리할 수도 있습니다. 배열 요소 또는 기타 품질을 기반으로 일치시키는 데 사용할 수 있는 여러 연산자가 있습니다.

필수 요소 지정

연산자는 주어진 모든$all 요소 를 ​​포함하는 배열이 있는 문서를 반환합니다 .

예를 들어, 작문과 문법을 가르치는 교사만 검색하려면 다음을 입력할 수 있습니다.

db.teachers.find({
    subjects: {
        $all: [ "composition", "grammar" ]
    }
})
 
{ "_id" : ObjectId("60eddca65eb74f5c676f3bab"), "first_name" : "Ronald", "last_name" : "Taft", "subjects" : [ "literature", "grammar", "composition" ] }
{ "_id" : ObjectId("60eddca65eb74f5c676f3bac"), "first_name" : "Casey", "last_name" : "Meyers", "subjects" : [ "literature", "composition", "grammar" ] }
{ "_id" : ObjectId("60eddca65eb74f5c676f3bae"), "first_name" : "Sophie", "last_name" : "Daggs", "subjects" : [ "literature", "composition", "grammar", "vocabulary", "pronunciation" ] }

하나의 요소에 대한 여러 요구 사항

$elemMatch테스트 중인 배열에 제공된 모든 조건을 충족하는 요소가 하나 이상 포함된 경우 연산자는 문서를 반환합니다 .

꽤 쓸모없는 예로서, "문학"과 "어휘" 사이의 알파벳순인 과목을 가르치는 교사를 위한 문서를 반환하려면 다음과 같이 입력할 수 있습니다.

db.teachers.find({
    subjects: {
        $elemMatch: {
            $gt: "literature",
            $lt: "vocabulary"
        }
    }
})
{ "_id" : ObjectId("60eddca65eb74f5c676f3baa"), "first_name" : "Nancy", "last_name" : "Smith", "subjects" : [ "vocabulary", "pronunciation" ] }
{ "_id" : ObjectId("60eddca65eb74f5c676f3bae"), "first_name" : "Sophie", "last_name" : "Daggs", "subjects" : [ "literature", "composition", "grammar", "vocabulary", "pronunciation" ] }

"발음"을 가르치는 두 교사가 여기에 나열되어 있습니다. 두 조건을 모두 충족하는 유일한 요소이기 때문입니다.

배열 크기로 쿼리

마지막으로 $size연산자를 사용하여 특정 크기의 문서를 쿼리할 수 있습니다. 예를 들어, 세 과목을 가르치는 모든 교사를 찾으려면 다음을 입력하십시오.

db.teachers.find({
    subjects: { $size: 3 }
})
{ "_id" : ObjectId("60eddca65eb74f5c676f3bab"), "first_name" : "Ronald", "last_name" : "Taft", "subjects" : [ "literature", "grammar", "composition" ] }
{ "_id" : ObjectId("60eddca65eb74f5c676f3bac"), "first_name" : "Casey", "last_name" : "Meyers", "subjects" : [ "literature", "composition", "grammar" ] }
반응형