찾기
정의
find
쿼리를 실행하고 클라이언트가 커서를 생성할 수 있는 첫 번째 결과 배치와 커서 ID를 반환합니다.
팁
mongosh
에서는db.collection.find()
또는db.collection.findOne()
헬퍼 메서드를 통해서도 이 명령을 실행할 수 있습니다.헬퍼 메서드는
mongosh
사용자에게 편리하지만 데이터베이스 명령과 동일한 수준의 정보를 반환하지 못할 수 있습니다. 편의가 필요하지 않거나 추가 리턴 필드가 필요한 경우 데이터베이스 명령을 사용합니다.
호환성
이 명령은 다음 환경에서 호스팅되는 배포에서 사용할 수 있습니다.
MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스
중요
이 명령은 M0, M2 및 M5 클러스터에서 제한적으로 지원 됩니다. 자세한 내용은 지원되지 않는 명령을 참조하세요.
MongoDB Enterprise: MongoDB의 구독 기반 자체 관리 버전
MongoDB Community: MongoDB의 소스 사용 가능 무료 자체 관리 버전
구문
find
명령의 구문은 다음과 같습니다.
버전 5.0에서 변경됨
db.runCommand( { find: <string>, filter: <document>, sort: <document>, projection: <document>, hint: <document or string>, skip: <int>, limit: <int>, batchSize: <int>, singleBatch: <bool>, comment: <any>, maxTimeMS: <int>, readConcern: <document>, max: <document>, min: <document>, returnKey: <bool>, showRecordId: <bool>, tailable: <bool>, oplogReplay: <bool>, noCursorTimeout: <bool>, awaitData: <bool>, allowPartialResults: <bool>, collation: <document>, allowDiskUse : <bool>, let: <document> // Added in MongoDB 5.0 } )
명령 필드
이 명령에는 다음과 같은 필드를 사용할 수 있습니다.
필드 | 유형 | 설명 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
find | 문자열 | 쿼리할 컬렉션 또는 뷰 의 이름입니다. | ||||||||||
filter | 문서 | 선택 사항. 쿼리 술어입니다. 지정하지 않으면 컬렉션의 모든 문서가 술어와 일치합니다. | ||||||||||
문서 | 선택 사항. 결과 순서를 지정하는 정렬 지정입니다. | |||||||||||
projection | 문서 | 선택 사항. 반환된 문서에 포함할 필드를 결정하기 위한 프로젝션 사양입니다. 투영 및 투영 연산자를참조하세요. 뷰에 대한 | ||||||||||
hint | 문자열 또는 문서 | 선택 사항. 인덱스 사양. 인덱스 이름을 문자열로 지정하거나 인덱스 키 패턴으로 지정합니다. 이 옵션을 지정하면 쿼리 시스템은 힌트 인덱스를 사용하는 계획만 고려합니다. 다음과 같은 예외를 제외하고 명령에 | ||||||||||
skip | 양의 정수 | 선택 사항. 건너뛸 문서 수입니다. 기본값은 입니다. | ||||||||||
limit | Non-negative integer | 선택 사항. 반환할 문서의 최대 개수. 지정하지 않은 경우 기본값은 '제한 없음'입니다. 개로 제한하면 제한을 설정하지 않은 것과 동일합니다. | ||||||||||
batchSize | non-negative integer | 선택 사항. 첫 번째 배치에서 반환할 문서 수입니다. 기본값은 101입니다. batchSize가 이면 커서가 설정되지만 첫 번째 배치에서는 문서가 반환되지 않습니다. 이전 유선 프로토콜 버전과 달리 | ||||||||||
| 부울 | 선택 사항. 첫 번째 일괄 처리 후에 커서를 닫을지 여부를 결정합니다. 기본값은 false입니다. | ||||||||||
comment | any | 선택 사항. 이 명령에 첨부할 사용자 제공 코멘트입니다. 설정되면 이 설명은 다음 위치에서 이 명령의 레코드와 함께 표시됩니다.
댓글은 유효한 모든 BSON types (문자열, 정수, 객체, 배열 등)이 될 수 있습니다.
| ||||||||||
maxTimeMS | non-negative integer | 선택 사항. 시간 제한을 밀리초 단위로 지정합니다. MongoDB는
| ||||||||||
readConcern | 문서 | 선택 사항. 읽기 고려를 지정합니다.
가능한 읽기 고려 수준은 다음과 같습니다.
읽기 고려 수준에 대한 자세한 내용은 읽기 고려 수준을 참조하세요.
| ||||||||||
max | 문서 | 선택 사항. 특정 인덱스에 대한 배타적 상한선입니다. 자세한 내용은
| ||||||||||
min | 문서 | 선택 사항. 특정 인덱스에 대한 포괄 하한입니다. 자세한 내용은
| ||||||||||
returnKey | 부울 | 선택 사항입니다. true인 경우 결과 문서의 인덱스 키만 반환합니다. 기본값은 false입니다. ReturnKey가 true이고 find 명령이 색인을 사용하지 않는 경우 반환된 문서는 비어 있습니다. | ||||||||||
showRecordId | 부울 | 선택 사항. 각 문서에 대한 레코드 식별자를 반환할지 여부를 결정합니다. true이면 반환된 문서에 $recordId 필드를 추가합니다. | ||||||||||
tailable | 부울 | 선택 사항. 제한된 컬렉션에 대해 테일 커서(tailable cursor)를 반환합니다. | ||||||||||
awaitData | 부울 | |||||||||||
noCursorTimeout | 부울 | 선택 사항입니다. 비활성 기간인 30분 후 서버가 비세션 유휴 커서의 시간 초과를 방지합니다. 세션의 일부인 커서에는 무시됩니다. 자세한 내용은 세션 유휴 시간 초과을 참조하세요. | ||||||||||
부울 | 선택 사항. 샤드된 컬렉션에 대한 쿼리의 경우, 쿼리된 하나 이상의 샤드를 사용할 수 없는 경우 명령(또는 후속 쿼리된 샤드를 사용할 수 없기 때문에 | |||||||||||
collation | 문서 | 선택 사항. 작업에 사용할 데이터 정렬을 지정합니다. 데이터 정렬을 사용하면 대소문자 및 악센트 표시 규칙과 같은 문자열 비교에 대한 언어별 규칙을 지정할 수 있습니다. 데이터 정렬 옵션의 구문은 다음과 같습니다:
데이터 정렬을 지정할 때 데이터 정렬이 지정되지 않았지만 컬렉션에 기본 데이터 정렬이 있는 경우( 컬렉션 또는 연산에 대한 데이터 정렬이 지정되지 않은 경우, MongoDB는 이전 버전에서 문자열 비교에 사용된 간단한 이진 비교를 사용합니다. 한 연산에 대해 여러 데이터 정렬을 지정할 수 없습니다. 예를 들어 필드별로 서로 다른 데이터 정렬을 지정할 수 없으며 정렬과 함께 찾기를 수행하는 경우 찾기 와 정렬에서 각각 다른 데이터 정렬을 사용하는 것은 허용되지 않습니다. | ||||||||||
부울 | 선택 사항. 이 옵션을 사용하여 특정 쿼리에 대한
MongoDB 6.0부터 자세한 내용은
대용량 차단 정렬의 메모리 제한에 대한 자세한 내용은 정렬 및 인덱스 사용을참조하세요. | |||||||||||
문서 | 선택 사항. 변수 목록이 있는 문서를 지정합니다. 이를 통해 쿼리 텍스트에서 변수를 분리하여 명령 가독성을 향상시킬 수 있습니다. 문서 구문은 다음과 같습니다:
변수는 표현식에서 반환된 값으로 설정되며 이후에는 변경할 수 없습니다. 명령에서 변수 값에 액세스하려면 변수를 사용하여 결과를 필터링하려면
버전 5.0에 추가. |
출력
이 명령은 커서 ID 및 첫 번째 문서 배치를 포함하여 커서 정보가 포함된 문서를 반환합니다. 예를 들어, 샤딩된 컬렉션에 대해 실행하면 다음 문서가 반환됩니다.
{ "cursor" : { "firstBatch" : [ { "_id" : ObjectId("5e8e2ca217b5324fa9847435"), "zipcode" : "20001", "x" : 1 }, { "_id" : ObjectId("5e8e2ca517b5324fa9847436"), "zipcode" : "30001", "x" : 1 } ], "partialResultsReturned" : true, "id" : NumberLong("668860441858272439"), "ns" : "test.contacts" }, "ok" : 1, "operationTime" : Timestamp(1586380205, 1), "$clusterTime" : { "clusterTime" : Timestamp(1586380225, 2), "signature" : { "hash" : BinData(0,"aI/jWsUVUSkMw8id+A+AVVTQh9Y="), "keyId" : NumberLong("6813364731999420435") } } }
필드 | 설명 |
---|---|
cursor | 커서 샤딩된 컬렉션에 대한 작업이 쿼리된 샤드를 사용할 수 없어 부분적인 결과를 반환하는 경우 쿼리된 샤드를 처음에는 |
"ok" | 명령에 성공했는지( 1 ) 또는 실패했는지(0 ) 여부를 나타냅니다. |
앞서 언급한 find
관련 필드 외에도 db.runCommand()
에는 복제본 세트 및 샤딩된 클러스터에 대한 다음 정보가 포함되어 있습니다.
$clusterTime
operationTime
자세한 내용은 db.runCommand() 결과를 참조하세요.
행동
$regex
Find 쿼리는 더 이상 잘못된 정규식을 무시하지 않습니다.
MongoDB 5.1부터 잘못된 $regex options
옵션은 더 이상 무시되지 않습니다. 이 변경으로 $regex options
는 aggregate
명령 및 투영 쿼리에서 $regex
을 사용하는 것과 더 일관성이 있습니다.
세션
세션 내에서 생성된 커서의 경우 세션 외부에서 getMore
을(를) 호출할 수 없습니다.
마찬가지로 세션 외부에서 만든 커서의 경우 세션 내부에서 getMore
를 호출할 수 없습니다.
세션 유휴 시간 초과
MongoDB 드라이버와 mongosh
는 승인되지 않은 쓰기 작업을 제외한 모든 작업을 서버 세션과 연결합니다. 세션과 명시적으로 연결되지 않은 작업(예: Mongo.startSession()
사용)의 경우, MongoDB 드라이버와 mongosh
는 암시적 세션을 생성하고 이를 작업과 연결합니다.
세션이 30분 이상 유휴 상태인 경우, MongoDB 서버는 해당 세션을 만료된 것으로 표시하고 언제든지 세션을 종료할 수 있습니다. MongoDB 서버가 세션을 종료하면 진행 중인 모든 작업과 해당 세션과 관련된 열린 커서도 종료됩니다. 여기에는 noCursorTimeout()
또는 30분보다 큰 maxTimeMS()
로 구성된 커서가 포함됩니다.
커서를 반환하는 작업의 경우 커서가 30분 이상 유휴 상태일 수 있는 경우 명시적 세션 내에서 Mongo.startSession()
을 사용하여 작업을 실행하고 refreshSessions
명령을 사용하여 세션을 주기적으로 새로 고칩니다. 자세한 내용은 세션 유휴 시간 초과를 참조하세요.
트랜잭션
트랜잭션 외부에서 생성된 커서의 경우 트랜잭션 내부에서
getMore
을(를) 호출할 수 없습니다.트랜잭션에서 생성된 커서의 경우 트랜잭션 외부에서
getMore
를 호출할 수 없습니다.
중요
대부분의 경우 분산 트랜잭션은 단일 문서 쓰기에 비해 더 큰 성능 비용이 발생하므로 분산 트랜잭션의 가용성이 효과적인 스키마 설계를 대체할 수는 없습니다. 대부분의 시나리오에서 비정규화된 데이터 모델 (내장된 문서 및 배열) 은 계속해서 데이터 및 사용 사례에 최적일 것입니다. 즉, 대부분의 시나리오에서 데이터를 적절하게 모델링하면 분산 트랜잭션의 필요성이 최소화됩니다.
추가 트랜잭션 사용 고려 사항(예: 런타임 제한 및 oplog 크기 제한)은 프로덕션 고려사항을 참조하세요.
클라이언트 연결 해제
MongoDB 4.2부터 find
를 발급한 클라이언트가 작업이 완료되기 전에 연결을 끊는 경우, MongoDB는 find
를 사용하여 를killOp
을 종료로 표시합니다.
Stable API
Stable API V1를 사용하는 경우 다음 find
명령 필드는 지원되지 않습니다:
awaitData
max
min
noCursorTimeout
oplogReplay
returnKey
showRecordId
tailable
인덱스 필터 및 데이터 정렬
MongoDB 6.0부터 인덱스 필터는 이전에 명령을 planCacheSetFilter
사용하여 설정한 데이터 정렬을 사용합니다.
MongoDB 8.0 부터는 인덱스 필터 를 추가하는 대신 쿼리 설정을 사용합니다. 인덱스 필터는 MongoDB 8.0 부터 더 이상 사용되지 않습니다.
쿼리 설정에는 인덱스 필터보다 더 많은 기능이 있습니다. 또한 인덱스 필터는 영구적이지 않으며 모든 클러스터 노드에 대한 인덱스 필터를 쉽게 만들 수 없습니다. 쿼리 설정을 추가하고 예제를 탐색하려면 setQuerySettings
를 참조하세요.
뷰에서 커서 동작 찾기
MongoDB 7.3 부터 singleBatch: true
및 batchSize: 1
옵션이 있는 뷰에서 찾기 명령을 사용할 때 커서 가 더 이상 반환되지 않습니다. 이전 버전의 MongoDB 에서는 단일 배치 옵션을 true
로 설정하다 한 경우에도 이러한 찾기 쿼리가 커서 를 반환했습니다.
쿼리 설정
버전 8.0에 추가 되었습니다.
쿼리 설정을 사용하여 인덱스 힌트를 설정하고, 작업 거부 필터 및 기타 필드를 설정할 수 있습니다. 해당 설정은 전체 클러스터의 쿼리 형태에 적용됩니다. 클러스터는 종료 후에도 설정을 유지합니다.
쿼리 옵티마이저는 쿼리 계획 중 추가 입력으로 쿼리 설정을 사용하여 쿼리를 실행할 계획에 영향을 미칩니다. 쿼리 설정을 사용하여 쿼리 형태를 차단할 수도 있습니다.
쿼리 설정을 추가하고 예시를 살펴보려면 setQuerySettings
를 참조하세요.
find
, distinct
및 aggregate
명령에 대한 쿼리 설정을 추가할 수 있습니다.
쿼리 설정은 더 많은 기능을 제공하며 더 이상 사용되지 않는 인덱스 필터보다 선호됩니다.
쿼리 설정을 제거 하려면 removeQuerySettings
를 사용합니다. 쿼리 설정을 가져오려면 집계 파이프라인 에서 $querySettings
단계를 사용합니다.
예시
정렬 및 제한 지정
다음 명령은 find
명령 필터링을 rating
필드와 cuisine
필드에서 실행합니다. 이 명령에는 일치하는 문서에서 _id
, name
, rating
및 address
필드의 필드만 반환하는 projection
(이)가 포함되어 있습니다.
이 명령은 결과 집합의 문서를 name
필드를 기준으로 정렬하고 결과 집합을 5개 문서로 제한합니다.
db.runCommand( { find: "restaurants", filter: { rating: { $gte: 9 }, cuisine: "italian" }, projection: { name: 1, rating: 1, address: 1 }, sort: { name: 1 }, limit: 5 } )
기본 읽기 고려 재정의
기본 읽기 문제 수준인 "local"
를 재정의하려면 readConcern
옵션을 사용하십시오.
복제본 세트에 대한 다음 작업은 대부분의 노드에 기록된 것으로 확인된 데이터의 가장 최근 복제본을 읽을 수 있도록 "majority"
의 읽기 고려를 지정합니다.
db.runCommand( { find: "restaurants", filter: { rating: { $lt: 5 } }, readConcern: { level: "majority" } } )
읽기 고려 수준에 관계없이 노드의 최신 데이터는 시스템에 있는 데이터의 최신 버전을 반영하지 않을 수 있습니다.
getMore
명령은 원래 find
명령에 지정된 readConcern
수준을 사용합니다.
cursor.readConcern()
메서드를 사용하여 mongosh
메서드 db.collection.find()
에 readConcern
을 지정할 수 있습니다.
db.restaurants.find( { rating: { $lt: 5 } } ).readConcern("majority")
사용 가능한 읽기 우려사항에 대한 자세한 내용은 읽기 우려사항을참조하세요.
데이터 정렬 지정
데이터 정렬을 사용하면 대소문자 및 악센트 표시 규칙과 같은 문자열 비교에 대한 언어별 규칙을 지정할 수 있습니다.
다음 작업은 지정된 데이터 정렬을 사용하여 find
명령을 실행합니다:
db.runCommand( { find: "myColl", filter: { category: "cafe", status: "a" }, sort: { category: 1 }, collation: { locale: "fr", strength: 1 } } )
mongosh
는 db.collection.find()
작업에 대한 데이터 정렬을 지정하기 위해 cursor.collation()
을 제공합니다.
에서 변수 사용 let
버전 5.0에 추가.
명령의 다른 곳에서 액세스할 수 있는 변수를 정의하려면 let 옵션을 사용합니다.
참고
변수를 사용하여 결과를 필터링하려면 $expr
연산자 내에서 변수에 액세스해야 합니다.
컬렉션 cakeFlavors
을 만듭니다:
db.cakeFlavors.insertMany( [ { _id: 1, flavor: "chocolate" }, { _id: 2, flavor: "strawberry" }, { _id: 3, flavor: "cherry" } ] )
다음 예시에서는 let
에 targetFlavor
변수를 정의하고 이 변수를 사용하여 초콜릿 케이크 맛을 검색합니다.
db.cakeFlavors.runCommand( { find: db.cakeFlavors.getName(), filter: { $expr: { $eq: [ "$flavor", "$$targetFlavor" ] } }, let : { targetFlavor: "chocolate" } } )