문서 메뉴

문서 홈애플리케이션 개발MongoDB 매뉴얼

db.collection.find()

이 페이지의 내용

  • 정의
  • 호환성
  • 구문
  • 행동
  • 예제
  • 자세히 알아보기
db.collection.find(query, projection, options)

중요

Mongo쉬 방법

이 페이지에서는 mongosh 메서드를 설명합니다. 이는 데이터베이스 명령이나 Node.js와 같은 언어별 드라이버에 대한 설명서가 아닙니다 .

데이터베이스 명령에 대해서는 find 명령을 참조하십시오.

MongoDB API 드라이버의 경우 언어별 MongoDB 드라이버 설명서를 참조하세요.

레거시 mongo 셸 문서는 해당 MongoDB 서버 릴리스 문서를 참조하세요.

Mongo 셸 V4.4

collection 또는 보기에서 문서를 선택하고 선택한 문서로 커서를 반환합니다.

반환합니다:query 기준과 일치하는 문서에 대한 커서 입니다. find() 메서드가 '문서를 반환'할 때 메서드는 실제로 커서를 문서에 반환합니다.

다음 환경에서 호스팅되는 배포에 db.collection.find() 사용할 수 있습니다.

  • MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스

find() 메서드의 형식은 다음과 같습니다.

db.collection.find( <query>, <projection>, <options> )

find() 메서드는 다음 매개 변수를 사용합니다.

매개변수
유형
설명
쿼리
문서

선택 사항. 쿼리 연산자를 사용하여 선택 필터를 지정하세요. 컬렉션의 모든 문서를 반환하려면 이 매개변수를 생략하거나 빈 문서({})를 전달하세요.

문서

선택 사항. 쿼리 필터와 일치하는 문서에서 반환할 필드를 지정합니다. 일치하는 문서의 모든 필드를 반환하려면 이 매개변수를 생략합니다. 자세한 내용은 프로젝션을 참조하세요.

문서

선택 사항. 쿼리에 대한 추가 옵션을 지정합니다. 이러한 옵션은 쿼리 동작과 결과 반환 방식을 수정합니다. 자세한 내용은 옵션을 참조하세요.

중요

언어 일관성

find()findAndModify() 프로젝션을 애그리게이션의 $project 단계와 일치시키는 작업의 일환으로,

projection 매개변수는 일치하는 문서에서 어떤 필드가 반환되는지를 결정합니다. projection 매개변수는 다음 형식의 문서를 사용합니다.

{ <field1>: <value>, <field2>: <value> ... }
프로젝션
설명
<field>: <1 or true>
필드 포함 여부를 지정합니다. 프로젝션 값에 0이 아닌 정수를 지정하면 연산은 해당 값을 true로 취급합니다.
<field>: <0 or false>
필드 제외 여부를 지정합니다.
"<field>.$": <1 or true>

$ 배열 프로젝션 연산자를 사용하여 배열 필드의 쿼리 조건과 일치하는 첫 번째 요소를 반환합니다. 프로젝션 값에 대해 0이 아닌 정수를 지정하면 연산은 값을 true로 처리합니다.

에는 사용할 수 없습니다.

<field>: <array projection>

배열 프로젝션 연산자($elemMatch, $slice)를 사용하여 포함할 배열 요소를 지정합니다.

에는 사용할 수 없습니다.

<field>: <$meta expression>

$meta 연산자 표현식을 사용하여 사용 가능한per-document metadata를 포함하도록 지정합니다.

에는 사용할 수 없습니다.

<field>: <aggregation expression>

프로젝션된 필드의 값을 지정합니다.

리터럴 및 애그리게이션 변수 사용을 포함하여 애그리게이션 표현식과 구문 을 사용하여 새 필드를 프로젝트하거나 기존 필드를 새 값으로 프로젝트할 수 있습니다.

  • 프로젝션 값에 숫자가 아니면서 부울이 아닌 리터럴(예: 리터럴 문자열, 배열 또는 연산자 표현식)을 지정하면 필드가 새 값으로 프로젝션됩니다.

    • { field: [ 1, 2, 3, "$someExistingField" ] }

    • { field: "New String Value" }

    • { field: { status: "Active", total: { $sum: "$existingArray" } } }

  • 필드의 리터럴 값을 프로젝션하려면 $literal 애그리게이션 표현식을 사용합니다. 예는 다음과 같습니다.

    • { field: { $literal: 5 } }

    • { field: { $literal: true } }

    • { field: { $literal: { fieldWithValue0: 0, fieldWithValue1: 1 } } }

버전 4.2 이하에서는 모든 사양 값(이전에 지원되지 않았던 문서 값 제외)이 필드의 포함 또는 제외를 나타내기 위해 true 또는 false 로 처리됩니다.

옵션
설명
허용 디스크 사용
파이프라인이 디스크의 임시 파일에 쓰기를 실행하는 데 100 메가바이트 이상의 메모리가 필요한지 여부입니다. 자세한 내용은 cursor.allowDiskUse() 를 참조하세요.
allowPartialResults (영문)
샤드 컬렉션에 대한 쿼리의 경우, 쿼리된 하나 이상의 샤드를 사용할 수 없는 경우 명령(또는 후속 getMore 명령)이 오류 대신 부분 결과를 반환하도록 허용합니다.
awaitData
커서가 테일 커서(tailable-wait cursor)인 경우. tailabletrue 이어야 합니다.
데이터 정렬
업데이트 작업을 위한 데이터 정렬 설정입니다.
comment
프로파일러 로그에 표시되는 쿼리에 $comment 를 추가합니다.
설명합니다.
제공된 상세도 모드에 따라 설명 출력을 추가합니다.
힌트
쿼리 옵티마이저가 쿼리에서 특정 인덱스를 사용하도록 강제합니다.
제한
결과 세트에 반환되는 문서의 제한을 설정합니다.
최대
특정 인덱스에 대한 배타적 상한선
maxAwaitTimeMS
서버가 테일 커서(tailable cursor) 쿼리를 충족하기 위해 새 문서를 기다리는 최대 시간입니다. tailableawaitDatatrue 이(가) 필요합니다.
최대 시간 (MS)
서버가 쿼리 실행을 허용해야 하는 최대 시간(밀리초)입니다.
특정 인덱스의 포괄적인 하한입니다.
noCursorTimeout
일정 시간 동안(기본적으로 10 분) 비활성 상태인 후 서버가 커서 시간을 초과할지 여부입니다.
readConcern
쿼리에 대한 읽기 고려 수준을 지정합니다.
읽기 설정
쿼리에 대한 읽기 설정 수준을 지정합니다.
returnKey
쿼리에 대해 인덱스 키만 반환할지 여부입니다.
showRecordId
반환된 문서에 $recordId 필드가 추가된 경우. $recordId 은 결과 집합에서 문서의 위치를 나타냅니다.
건너뛰기
결과 세트에서 첫 번째 문서를 반환하기 전에 건너뛸 문서 수입니다.
정렬
결과 세트에서 반환되는 문서의 순서입니다. 정렬에 지정된 필드에는 인덱스가 있어야 합니다.
tailable
커서가 테일 커서(tailable cursor)인지 여부를 나타냅니다. 테일 커서(tailable cursor)는 쿼리의 초기 결과가 소진된 후에도 열린 상태로 유지됩니다. 테일 커서(tailable cursor)는 고정 사이즈 컬렉션에서만 사용할 수 있습니다.

포함된 문서의 필드에 대해서는 다음 둘 중 하나를 사용하여 필드를 지정할 수 있습니다.

  • 점 표기법(예: "field.nestedfield": <value>

  • 중첩된 양식(예: { field: { nestedfield: <value> } }

필드를 표시하지 않기 위해 프로젝션에서 _id: 0을 명시적으로 지정하지 않는 한 _id 필드는 기본적으로 반환된 문서에 포함됩니다.

projection 필드는 포함과 제외 사양을 모두 포함할 수 없습니다. 단, _id 필드는 예외입니다.

  • 필드를 명시적으로 포함하는 프로젝션에서 _id 필드는 명시적으로 제외할 수 있는 유일한 필드입니다.

  • 필드를 명시적으로 제외하는 프로젝션에서는 _id 필드가 명시적으로 포함할 수 있는 유일한 필드이지만, _id 필드는 기본적으로 포함됩니다.

프로젝션 예제를 참조하세요.

}에서 를 실행하면 db.collection.find() mongosh 커서가 자동으로 반복되어 처음 문서까지 표시됩니다.20 it 반복을 계속하려면 를 입력합니다.

드라이버를 사용하여 반환된 문서에 액세스하려면 드라이버 언어에 적합한 커서 처리 메커니즘을 사용하세요.

대한 읽기 고려 db.collection.find()를 지정하려면 cursor.readConcern() 메서드를 사용합니다.

MongoDB는 비교 목적으로 일부 데이터 유형을 동등한 것으로 취급합니다. 예를 들어 숫자 유형은 비교 전에 변환을 거칩니다. 그러나 대부분의 데이터 유형에서 비교 연산자는 대상 필드의 BSON type이 쿼리 피연산자의 유형과 일치하는 문서에 대해서만 비교를 수행합니다. 다음 collection을 고려해 보세요.

{ "_id": "apples", "qty": 5 }
{ "_id": "bananas", "qty": 7 }
{ "_id": "oranges", "qty": { "in stock": 8, "ordered": 12 } }
{ "_id": "avocados", "qty": "fourteen" }

다음 쿼리는 $gt를 사용하여 qty의 값이 4보다 큰 문서를 반환합니다.

db.collection.find( { qty: { $gt: 4 } } )

이 쿼리는 다음 문서를 반환합니다.

{ "_id": "apples", "qty": 5 }
{ "_id": "bananas", "qty": 7 }

_id"avocados"인 문서는 qty 값이 string 유형이고 $gt 피연산자가 integer 유형이기 때문에 반환되지 않습니다.

_id"oranges"인 문서는 qty 값이 object 유형이므로 반환되지 않습니다.

참고

collection에 데이터 유형을 적용하려면 스키마 유효성 검사를 사용하세요.

세션 내에서 생성된 커서의 경우 세션 외부에서 getMore을(를) 호출할 수 없습니다.

마찬가지로 세션 외부에서 만든 커서의 경우 세션 내부에서 getMore를 호출할 수 없습니다.

MongoDB 드라이버와 mongosh 는 승인되지 않은 쓰기 작업을 제외한 모든 작업을 서버 세션 과 연결합니다. 세션과 명시적으로 연결되지 않은 작업(예: Mongo.startSession() 사용)의 경우, MongoDB 드라이버와 mongosh 는 암시적 세션을 생성하여 작업과 연결합니다.

세션이 30분 이상 유휴 상태인 경우, MongoDB 서버는 해당 세션을 만료된 것으로 표시하고 언제든지 세션을 종료할 수 있습니다. MongoDB 서버가 세션을 종료하면 진행 중인 모든 작업과 해당 세션과 관련된 열린 커서도 종료됩니다. 여기에는 noCursorTimeout() 또는 30분보다 큰 maxTimeMS()로 구성된 커서가 포함됩니다.

30분 이상 유휴 상태일 수 있는 작업의 경우 Mongo.startSession()을 사용하여 작업을 명시적 세션과 연결하고 refreshSessions 명령을 사용하여 세션을 정기적으로 새로 고침합니다. 자세한 내용은 세션 유휴 시간 제한을 참조하세요.

db.collection.find()분산 트랜잭션 내에서 사용할 수 있습니다.

  • 트랜잭션 외부에서 생성된 커서의 경우 트랜잭션 내부에서 getMore을(를) 호출할 수 없습니다.

  • 트랜잭션에서 생성된 커서의 경우 트랜잭션 외부에서 getMore를 호출할 수 없습니다.

중요

대부분의 경우 분산 트랜잭션은 단일 문서 쓰기에 비해 더 큰 성능 비용이 발생하므로 분산 트랜잭션의 가용성이 효과적인 스키마 설계를 대체할 수는 없습니다. 대부분의 시나리오에서 비정규화된 데이터 모델 (내장된 문서 및 배열) 은 계속해서 데이터 및 사용 사례에 최적일 것입니다. 즉, 대부분의 시나리오에서 데이터를 적절하게 모델링하면 분산 트랜잭션의 필요성이 최소화됩니다.

추가 트랜잭션 사용 고려 사항(예: 런타임 제한 및 oplog 크기 제한)은 프로덕션 고려사항을 참조하세요.

MongoDB 4 부터 시작.2, db.collection.find() 를 발행한 클라이언트가 작업이 완료되기 전에 연결이 끊어지면 MongoDB는killOp를 사용하여 { db.collection.find() 를 종료로 표시합니다

이 섹션의 예제에서는 일반적으로 다음과 같은 문서 양식이 있는 bios 컬렉션의 문서를 사용합니다.

{
"_id" : <value>,
"name" : { "first" : <string>, "last" : <string> }, // embedded document
"birth" : <ISODate>,
"death" : <ISODate>,
"contribs" : [ <string>, ... ], // Array of Strings
"awards" : [
{ "award" : <string>, year: <number>, by: <string> } // Array of embedded documents
...
]
}

bios 컬렉션을 만들고 채우려면 bios 컬렉션을 참조하세요.

매개 변수가 없는 find() 메서드는 컬렉션의 모든 문서를 반환하고 문서의 모든 필드를 반환합니다. 예를 들어 다음 작업은 bios 컬렉션의 모든 문서를 반환합니다.

db.bios.find()
  • 다음 연산은 _id5bios 컬렉션의 문서를 반환합니다.

    db.bios.find( { _id: 5 } )
  • 다음 작업은 name 포함된 문서의 last 필드가 "Hopper"와 동일한 bios collection의 문서를 반환합니다:

    db.bios.find( { "name.last": "Hopper" } )

    참고

    포함된 문서의 필드에 액세스하려면 점 표기법("<embedded document>.<field>")을 사용합니다.

선택 기준 세트와 일치하는 문서를 찾으려면 <criteria> 매개 변수와 함께 find() 를 호출합니다.

MongoDB는 기준을 지정하는 다양한 쿼리 연산자를 제공합니다.

  • 다음 연산은 $in 연산자를 사용하여 _id5 또는 ObjectId("507c35dd8fada716c89d0013")bios 컬렉션의 문서를 반환합니다.

    db.bios.find(
    { _id: { $in: [ 5, ObjectId("507c35dd8fada716c89d0013") ] } }
    )
  • 다음 작업은 $gt 연산자를 사용하여 birthnew Date('1950-01-01')보다 큰 bios 컬렉션의 모든 문서를 반환합니다.

    db.bios.find( { birth: { $gt: new Date('1950-01-01') } } )
  • 다음 작업은 $regex 연산자를 사용하여 bios 컬렉션에서 name.last 필드가 문자 N(또는 "LIKE N%")으로 시작하는 문서를 반환합니다.

    db.bios.find(
    { "name.last": { $regex: /^N/ } }
    )

쿼리 연산자 목록은 쿼리 선택기를 참조하세요.

비교 연산자를 결합하여 필드에 대한 범위를 지정합니다. 다음 작업은 birthnew Date('1940-01-01')에서 new Date('1960-01-01')(제외) 사이인 bios collection 문서에서 반환합니다.

db.bios.find( { birth: { $gt: new Date('1940-01-01'), $lt: new Date('1960-01-01') } } )

쿼리 연산자 목록은 쿼리 선택기를 참조하세요.

다음 작업은 birth 필드가 greater than new Date('1950-01-01')이고 death 필드가 존재하지 않는 bios collection의 모든 문서를 반환합니다.

db.bios.find( {
birth: { $gt: new Date('1920-01-01') },
death: { $exists: false }
} )

쿼리 연산자 목록은 쿼리 선택기를 참조하세요.

다음 예제에서는 bios collection에서 name 포함 필드를 쿼리합니다.

다음 작업은 순서를 포함하여 포함된 문서 name정확히 { first: "Yukihiro", last: "Matsumoto" }bios collection의 문서를 반환합니다.

db.bios.find(
{ name: { first: "Yukihiro", last: "Matsumoto" } }
)

name 필드는 포함된 문서와 정확히 일치해야 합니다. 쿼리는 다음 name 필드가 있는 문서와 일치하지 않습니다.

{
first: "Yukihiro",
aka: "Matz",
last: "Matsumoto"
}
{
last: "Matsumoto",
first: "Yukihiro"
}

다음 작업은 포함된 문서 name"Yukihiro" 값이 포함된 first 필드 및 "Matsumoto" 값이 포함된 last 필드가 포함된 bios collection의 문서를 반환합니다. 이 쿼리는 점 표기법을 사용하여 포함된 문서의 필드에 액세스합니다.

db.bios.find(
{
"name.first": "Yukihiro",
"name.last": "Matsumoto"
}
)

쿼리는 name 필드에 값이 "Yukihiro"first 필드와 값이 "Matsumoto"last 필드가 있는 포함된 문서를 가진 문서와 일치합니다. 예를 들어 쿼리는 다음 값 중 하나를 포함하는 name 필드가 있는 문서와 일치합니다.

{
first: "Yukihiro",
aka: "Matz",
last: "Matsumoto"
}
{
last: "Matsumoto",
first: "Yukihiro"
}

자세한 내용 및 예시는 포함/중첩 문서에 대한 쿼리를 참조하세요.

다음 예제에서는 bios 컬렉션contribs 배열을 쿼리합니다.

  • 다음 연산은 배열 필드 contribs"UNIX"가 포함된 bios 컬렉션의 문서를 반환합니다.

    db.bios.find( { contribs: "UNIX" } )
  • 다음 연산은 배열 필드 contribs"ALGOL" 또는 "Lisp" 요소가 포함된 bios 컬렉션의 문서를 반환합니다.

    db.bios.find( { contribs: { $in: [ "ALGOL", "Lisp" ]} } )
  • 다음 작업은 $all 쿼리 연산자를 사용하여 배열 필드 contribs에 요소 "ALGOL""Lisp"가 모두 포함된 bios collection의 문서를 반환합니다.

    db.bios.find( { contribs: { $all: [ "ALGOL", "Lisp" ] } } )

    더 많은 예시를 보려면 $all을 참조하세요. $elemMatch도 함께 참조해도 좋습니다.

  • 다음 연산은 $size 연산자를 사용하여 배열 크기 contribs가 4인 bios 컬렉션의 문서를 반환합니다.

    db.bios.find( { contribs: { $size: 4 } } )

배열 쿼리에 대한 자세한 내용과 예제는 다음을 참조하세요.

배열별 쿼리 연산자 목록은 배열을 참조하세요.

다음 예제에서는 bios 컬렉션awards 배열을 쿼리합니다.

  • 다음 연산은 awards 배열에 award 필드가 "Turing Award"인 요소가 포함된 bios 컬렉션의 문서를 반환합니다.

    db.bios.find(
    { "awards.award": "Turing Award" }
    )
  • 다음 작업은 bios collection에 있는 문서 중 awards 배열에 award 필드가 모두 "Turing Award"이고 year 필드가 1980보다 큰 요소가 하나 이상 포함된 문서를 반환합니다.

    db.bios.find(
    { awards: { $elemMatch: { award: "Turing Award", year: { $gt: 1980 } } } }
    )

    $elemMatch 연산자를 사용하여 배열 요소에 여러 기준을 지정할 수 있습니다.

배열 쿼리에 대한 자세한 내용과 예제는 다음을 참조하세요.

배열별 쿼리 연산자 목록은 배열을 참조하세요.

프로젝션 매개변수는 반환할 필드를 지정합니다. 매개변수에는 포함 또는 제외 사양이 포함되며 _id 필드에 대한 제외 사양이 아닌 경우 둘 다 포함되지는 않습니다.

참고

프로젝션 문서 _id: 0에서 _id 필드가 명시적으로 제외되지 않는 한 _id 필드가 반환됩니다.

다음 연산은 bios 컬렉션에서 모든 문서를 찾아 name 필드, contribs 필드 및 _id 필드만 반환합니다.

db.bios.find( { }, { name: 1, contribs: 1 } )

참고

프로젝션 문서 _id: 0에서 _id 필드가 명시적으로 제외되지 않는 한 _id 필드가 반환됩니다.

다음 연산은 bios 컬렉션을 쿼리하여 name 포함된 문서의 first 필드와 birth 필드를 제외한 모든 필드를 반환합니다.

db.bios.find(
{ contribs: 'OOP' },
{ 'name.first': 0, birth: 0 }
)

참고

프로젝션 문서 _id: 0에서 _id 필드가 명시적으로 제외되지 않는 한 _id 필드가 반환됩니다.

다음 연산은 bios 컬렉션에서 문서를 찾아 name 필드와 contribs 필드만 반환합니다.

db.bios.find(
{ },
{ name: 1, contribs: 1, _id: 0 }
)

다음 연산은 bios 컬렉션을 쿼리하여 name 포함된 문서의 last 필드와 contribs 배열의 처음 두 요소를 반환합니다.

db.bios.find(
{ },
{ _id: 0, 'name.last': 1, contribs: { $slice: 2 } } )

중첩된 양식을 사용하여 포함된 필드를 지정할 수도 있습니다. 예를 들면 다음과 같습니다.

db.bios.find(
{ },
{ _id: 0, name: { last: 1 }, contribs: { $slice: 2 } }
)

db.collection.find() 프로젝션은 애그리게이션 표현식 및 구문을 허용할 수 있습니다.

애그리게이션 표현식과 구문을 사용하여 새 필드를 프로젝션하거나 기존 필드를 새 값으로 프로젝션할 수 있습니다. 예를 들어 다음 작업에서는 애그리게이션 표현식을 사용하여 nameawards 필드의 값을 재정의하고, 새 필드 reportDate, reportBy, reportNumber를 포함합니다.

db.bios.find(
{ },
{
_id: 0,
name: {
$concat: [
{ $ifNull: [ "$name.aka", "$name.first" ] },
" ",
"$name.last"
]
},
birth: 1,
contribs: 1,
awards: { $cond: { if: { $isArray: "$awards" }, then: { $size: "$awards" }, else: 0 } },
reportDate: { $dateToString: { date: new Date(), format: "%Y-%m-%d" } },
reportBy: "hellouser123",
reportNumber: { $literal: 1 }
}
)

reportRun 필드를 reportRun 값으로 설정하면 작업이 다음 문서를 반환합니다.

{ "birth" : ISODate("1924-12-03T05:00:00Z"), "contribs" : [ "Fortran", "ALGOL", "Backus-Naur Form", "FP" ], "name" : "John Backus", "awards" : 4, "reportDate" : "2020-06-05", "reportBy" : "hellouser123", "reportNumber" : 1 }
{ "birth" : ISODate("1927-09-04T04:00:00Z"), "contribs" : [ "Lisp", "Artificial Intelligence", "ALGOL" ], "name" : "John McCarthy", "awards" : 3, "reportDate" : "2020-06-05", "reportBy" : "hellouser123", "reportNumber" : 1 }
{ "birth" : ISODate("1906-12-09T05:00:00Z"), "contribs" : [ "UNIVAC", "compiler", "FLOW-MATIC", "COBOL" ], "name" : "Grace Hopper", "awards" : 4, "reportDate" : "2020-06-05", "reportBy" : "hellouser123", "reportNumber" : 1 }
{ "birth" : ISODate("1926-08-27T04:00:00Z"), "contribs" : [ "OOP", "Simula" ], "name" : "Kristen Nygaard", "awards" : 3, "reportDate" : "2020-06-05", "reportBy" : "hellouser123", "reportNumber" : 1 }
{ "birth" : ISODate("1931-10-12T04:00:00Z"), "contribs" : [ "OOP", "Simula" ], "name" : "Ole-Johan Dahl", "awards" : 3, "reportDate" : "2020-06-05", "reportBy" : "hellouser123", "reportNumber" : 1 }
{ "birth" : ISODate("1956-01-31T05:00:00Z"), "contribs" : [ "Python" ], "name" : "Guido van Rossum", "awards" : 2, "reportDate" : "2020-06-05", "reportBy" : "hellouser123", "reportNumber" : 1 }
{ "birth" : ISODate("1941-09-09T04:00:00Z"), "contribs" : [ "UNIX", "C" ], "name" : "Dennis Ritchie", "awards" : 3, "reportDate" : "2020-06-05", "reportBy" : "hellouser123", "reportNumber" : 1 }
{ "birth" : ISODate("1965-04-14T04:00:00Z"), "contribs" : [ "Ruby" ], "name" : "Matz Matsumoto", "awards" : 1, "reportDate" : "2020-06-05", "reportBy" : "hellouser123", "reportNumber" : 1 }
{ "birth" : ISODate("1955-05-19T04:00:00Z"), "contribs" : [ "Java" ], "name" : "James Gosling", "awards" : 2, "reportDate" : "2020-06-05", "reportBy" : "hellouser123", "reportNumber" : 1 }
{ "contribs" : [ "Scala" ], "name" : "Martin Odersky", "awards" : 0, "reportDate" : "2020-06-05", "reportBy" : "hellouser123", "reportNumber" : 1 }

find() 메서드는 결과에 커서 를 반환합니다.

mongosh 에서 반환된 커서가 var 키워드를 사용하여 변수에 할당되지 않은 경우 커서가 자동으로 반복되어 쿼리와 일치하는 처음 20 문서에 액세스합니다. displayBatchSize 변수를 업데이트하여 자동으로 반복되는 문서 수를 변경할 수 있습니다.

다음 예제에서는 배치 크기를 3으로 설정합니다. 이후의 db.collection.find() 연산에서는 문서를 커서 반복 1회당 3개만 반환합니다.

config.set( "displayBatchSize", 3 )

결과를 수동으로 반복하려면 다음 섹션과 같이 var 키워드를 사용하여 반환된 커서를 변수에 할당합니다.

다음 예제에서는 변수 myCursor를 사용하여 커서를 반복하고 일치하는 문서를 인쇄합니다.

var myCursor = db.bios.find( );
myCursor

다음 예시에서는 커서 메서드 next()를 사용하여 문서에 액세스합니다.

var myCursor = db.bios.find( );
var myDocument = myCursor.hasNext() ? myCursor.next() : null;
if (myDocument) {
var myName = myDocument.name;
print (tojson(myName));
}

인쇄하려면 print(tojson()) 대신 printjson() 메서드를 사용할 수도 있습니다.

if (myDocument) {
var myName = myDocument.name;
printjson(myName);
}

다음 예제에서는 커서 메서드 forEach()를 사용하여 커서를 반복하고 문서에 액세스합니다.

var myCursor = db.bios.find( );
myCursor.forEach(printjson);

mongosh드라이버 는 메서드가 반환한 커서 를 find() 호출하여 동작을 수정하는 여러 커서 메서드를 제공합니다.

sort() 메서드는 결과 설정의 문서를 정렬합니다. 다음 작업은 bios collection 문서를 name 필드를 기준으로 오름차순으로 정렬하여 반환합니다:

db.bios.find().sort( { name: 1 } )

sort()는 SQL에서 ORDER BY 문에 해당합니다.

limit() 메서드는 결과 세트의 문서 수를 제한합니다. 다음 작업은 bios collection에서 최대 5개의 문서를 반환합니다.

db.bios.find().limit( 5 )

limit()는 SQL에서 LIMIT 문에 해당합니다.

skip() 메서드는 결과 세트의 시작점을 제어합니다. 다음 작업은 bios collection의 처음 5개의 문서를 건너뛰고 나머지 모든 문서를 반환합니다.

db.bios.find().skip( 5 )

데이터 정렬을 사용하면 대소문자 및 악센트 표시 규칙과 같은 문자열 비교에 대한 언어별 규칙을 지정할 수 있습니다.

collation() 메서드는 작업에 대한 데이터 db.collection.find() 정렬 을 지정합니다.

db.bios.find( { "name.last": "hopper" } ).collation( { locale: "en_US", strength: 1 } )

다음 성명서는 커서 메서드 limit()sort()를 연결합니다.

db.bios.find().sort( { name: 1 } ).limit( 5 )
db.bios.find().limit( 5 ).sort( { name: 1 } )

두 성명서는 동일합니다. 즉, limit()sort() 메서드를 연결하는 순서는 중요하지 않습니다. 두 성명서 모두 '이름'의 오름차순 정렬 순서에 따라 처음 5개의 문서를 반환합니다.

쿼리 옵션을 지정하여 쿼리 동작을 수정하고 결과가 반환되는 방식을 지정할 수 있습니다.

예를 들어 find 메서드의 다른 곳에서 액세스할 수 있는 변수를 정의하려면 let 옵션을 사용합니다. 변수를 사용하여 결과를 필터링하려면 $expr 연산자 내에서 변수에 액세스해야 합니다.

컬렉션 cakeFlavors을 만듭니다:

db.cakeFlavors.insertMany( [
{ _id: 1, flavor: "chocolate" },
{ _id: 2, flavor: "strawberry" },
{ _id: 3, flavor: "cherry" }
] )

다음 예제에서는 lettargetFlavor 변수를 정의하고 이 변수를 사용하여 초콜릿 케이크 맛을 검색합니다.

db.cakeFlavors.find(
{ $expr: { $eq: [ "$flavor", "$$targetFlavor" ] } },
{ _id: 0 },
{ let : { targetFlavor: "chocolate" }
} )

출력:

[ { flavor: 'chocolate' } ]

MongoDB 7.0부터는 새로운 USER_ROLES 시스템 변수를 사용하여 사용자 역할을 반환할 수 있습니다.

이 섹션의 시나리오에서는 예산 정보가 포함된 컬렉션의 문서에 대한 액세스 권한이 제한된 다양한 역할의 사용자를 보여줍니다.

이 시나리오는 USER_ROLES의 한 가지 가능한 용도를 보여 줍니다. budget collection에는 allowedRoles(이)라는 필드가 있는 문서가 포함되어 있습니다. 다음 시나리오에서 볼 수 있듯이 allowedRoles 필드에 있는 사용자 역할을 USER_ROLES 시스템 변수에서 반환한 역할과 비교하는 쿼리를 쓸 수 있습니다.

참고

다른 USER_ROLES 예제 시나리오에 대해 알아보려면 현재 사용자에게 부여된 역할에 대한 의료 정보 조회를 참조하세요. 이 예에서는 다음 예에서처럼 문서 필드에 사용자 역할을 저장하지 않습니다.

이 섹션의 예산 시나리오의 경우 다음 단계를 수행하여 역할, 사용자 및 budget 컬렉션을 만들 수 있습니다.

1

실행:

db.createRole( { role: "Marketing", roles: [], privileges: [] } )
db.createRole( { role: "Sales", roles: [], privileges: [] } )
db.createRole( { role: "Development", roles: [], privileges: [] } )
db.createRole( { role: "Operations", roles: [], privileges: [] } )
2

필수 역할로 JohnJane이라는 이름의 사용자를 만듭니다. test 데이터베이스를 데이터베이스 이름으로 바꿉니다.

db.createUser( {
user: "John",
pwd: "jn008",
roles: [
{ role: "Marketing", db: "test" },
{ role: "Development", db: "test" },
{ role: "Operations", db: "test" },
{ role: "read", db: "test" }
]
} )
db.createUser( {
user: "Jane",
pwd: "je009",
roles: [
{ role: "Sales", db: "test" },
{ role: "Operations", db: "test" },
{ role: "read", db: "test" }
]
} )
3

실행:

db.budget.insertMany( [
{
_id: 0,
allowedRoles: [ "Marketing" ],
comment: "For marketing team",
yearlyBudget: 15000
},
{
_id: 1,
allowedRoles: [ "Sales" ],
comment: "For sales team",
yearlyBudget: 17000,
salesEventsBudget: 1000
},
{
_id: 2,
allowedRoles: [ "Operations" ],
comment: "For operations team",
yearlyBudget: 19000,
cloudBudget: 12000
},
{
_id: 3,
allowedRoles: [ "Development" ],
comment: "For development team",
yearlyBudget: 27000
}
] )

John에 액세스할 수 있는 문서를 검색하려면 다음 단계를 수행합니다.

1

실행:

db.auth( "John", "jn008" )
2

시스템 변수를 사용하려면 변수 이름 시작 부분에 $$를 추가합니다. USER_ROLES 시스템 변수를 $$USER_ROLES로 지정합니다.

실행:

db.budget.find( {
$expr: {
$not: {
$eq: [ { $setIntersection: [ "$allowedRoles", "$$USER_ROLES.role" ] }, [] ]
}
}
} )

이전 예제에서는 예제를 실행하는 사용자가 가진 역할 중 하나 이상과 일치하는 budget 컬렉션의 문서를 반환합니다. 이를 위해 이 예제에서는 $setIntersection을 사용하여 budget 문서 allowedRoles 필드와 $$USER_ROLES의 사용자 역할 세트 사이의 교집합이 비어 있지 않은 문서를 반환합니다.

3

John Marketing, OperationsDevelopment역할이 있으며 다음과 같은 문서를 볼 수 있습니다.

[
{
_id: 0,
allowedRoles: [ 'Marketing' ],
comment: 'For marketing team',
yearlyBudget: 15000
},
{
_id: 2,
allowedRoles: [ 'Operations' ],
comment: 'For operations team',
yearlyBudget: 19000,
cloudBudget: 12000
},
{
_id: 3,
allowedRoles: [ 'Development' ],
comment: 'For development team',
yearlyBudget: 27000
}
]

Jane에 액세스할 수 있는 문서를 검색하려면 다음 단계를 수행합니다.

1

실행:

db.auth( "Jane", "je009" )
2

실행:

db.budget.find( {
$expr: {
$not: {
$eq: [ { $setIntersection: [ "$allowedRoles", "$$USER_ROLES.role" ] }, [] ]
}
}
} )
3

Jane 은(는) SalesOperations 역할을 가지며 다음과 같은 문서를 볼 수 있습니다.

[
{
_id: 1,
allowedRoles: [ 'Sales' ],
comment: 'For sales team',
yearlyBudget: 17000,
salesEventsBudget: 1000
},
{
_id: 2,
allowedRoles: [ 'Operations' ],
comment: 'For operations team',
yearlyBudget: 19000,
cloudBudget: 12000
}
]

참고

샤드 클러스터에서는 사용자를 대신하여 다른 서버 노드가 샤드에서 쿼리를 실행할 수 있습니다. 이러한 쿼리에서 USER_ROLES는 여전히 사용자에 대한 역할로 채워져 있습니다.

다음 예는 find() 쿼리에서 options 필드를 사용하는 방법을 보여줍니다. 다음 insertMany() 를 사용하여 users 컬렉션을 설정합니다.

db.users.insertMany( [
{ username: "david", age: 27 },
{ username: "amanda", age: 25 },
{ username: "rajiv", age: 32 },
{ username: "rajiv", age: 90 }
] )

다음 쿼리는 limit 옵션 매개변수를 사용하여 결과 세트의 문서 수를 제한합니다.

db.users.find(
{ username : "rajiv"}, // query
{ age : 1 }, // projection
{ limit : 1 } // options
)

다음 쿼리는 options 매개 변수를 사용하여 allowDiskUse 을 활성화합니다.

db.users.find(
{ username : "david" },
{ age : 1 },
{ allowDiskUse : true }
)

다음 쿼리는 options 매개변수를 사용하여 executionStats 설명 출력을 가져옵니다.

var cursor = db.users.find(
{ username: "amanda" },
{ age : 1 },
{ explain : "executionStats" }
)
cursor.next()

다음 쿼리는 options 단일 쿼리에 여러 를 사용합니다. 이 쿼리는 limit 로 설정된 를 사용하여 2 두 개의 문서만 반환하고,showRecordId 로 설정된 true 을 사용하여 결과 집합에서 문서의 위치를 반환합니다.

db.users.find(
{},
{ username: 1, age: 1 },
{
limit: 2,
showRecordId: true
}
)
← db.collection.explain()