db.collection.find()
드라이버가 포함된 MongoDB
이 페이지에서는 mongosh
메서드를 설명합니다. MongoDB 드라이버에서 해당 메서드를 보려면 프로그래밍 언어의 해당 페이지를 참조하세요.
정의
호환성
이 메서드는 다음 환경에서 호스팅되는 배포에서 사용할 수 있습니다.
MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스
중요
이 명령은 M0, M2 및 M5 클러스터에서 제한적으로 지원 됩니다. 자세한 내용은 지원되지 않는 명령을 참조하세요.
MongoDB Enterprise: MongoDB의 구독 기반 자체 관리 버전
MongoDB Community: MongoDB의 소스 사용 가능 무료 자체 관리 버전
구문
find()
메서드의 형식은 다음과 같습니다.
db.collection.find( <query>, <projection>, <options> )
find()
메서드는 다음 매개변수를 사용합니다.
행동
프로젝션
중요
언어 일관성
find()
및 findAndModify()
프로젝션을 집계의 $project
단계와 일치시키는 작업의 일환으로,
find()
및findAndModify()
프로젝션은 집계 표현식과 구문을 허용할 수 있습니다.MongoDB는 프로젝션과 관련하여 추가 제한 사항을 시행합니다. 자세한 내용은 프로젝션 제한 사항을 참조하세요.
projection
매개변수는 일치하는 문서에서 어떤 필드가 반환되는지를 결정합니다. projection
매개변수는 다음 형식의 문서를 사용합니다.
{ <field1>: <value>, <field2>: <value> ... }
프로젝션 | 설명 |
---|---|
<field>: <1 or true> | 필드 포함 여부를 지정합니다. 프로젝션 값에 0이 아닌 정수를 지정하면 연산은 해당 값을 true 로 취급합니다. |
<field>: <0 or false> | 필드 제외 여부를 지정합니다. |
"<field>.$": <1 or true> | |
<field>: <array projection> | 배열 프로젝션 연산자( 뷰에는 사용할 수 없습니다. |
<field>: <$meta expression> |
뷰에는 사용할 수 없습니다. |
<field>: <aggregation expression> | 프로젝션된 필드의 값을 지정합니다. 리터럴 및 집계 변수 사용을 포함한 집계 식 및 구문을 사용하면 새 필드를 프로젝션하거나 기존 필드를 새 값으로 프로젝션할 수 있습니다.
|
옵션
옵션 | 설명 |
---|---|
allowDiskUse | 실행하는 데 100메가바이트 이상의 메모리가 필요한 파이프라인이 디스크의 임시 파일에 쓰기를 허용할지 여부. 자세한 내용은 cursor.allowDiskUse() 를 참조하세요. |
allowPartialResults (영문) | 샤드된 컬렉션에 대한 쿼리의 경우, 쿼리된 하나 이상의 샤드를 사용할 수 없는 경우 명령(또는 후속 getMore 명령)이 오류 대신 부분적인 결과를 반환하도록 허용합니다. |
awaitData | 커서가 테일 대기 커서(tailable-wait cursor)인 경우. tailable 이 true 여야 합니다. |
데이터 정렬 | 업데이트 연산에 대한 데이터 정렬 설정입니다. |
comment | 프로파일러 로그에 표시되는 쿼리에 $comment 를 추가합니다. |
설명합니다. | 제공된 상세도 모드에 따라 설명 출력을 추가합니다. |
hint | 쿼리 옵티마이저가 쿼리에서 특정 인덱스를 사용하도록 강제합니다. |
limit | 결과 집합에 반환되는 문서의 제한을 설정합니다. |
최대 | 특정 인덱스에 대한 배타적 상한선 |
maxAwaitTimeMS | 서버가 테일 커서(tailable cursor) 쿼리를 충족하기 위해 새 문서를 기다리는 최대 시간입니다. tailable 및 awaitData true 여야 합니다. |
최대 시간 (MS) | 서버가 쿼리 실행을 허용해야 하는 최대 시간(밀리초)입니다. |
min | 특정 인덱스의 포괄적인 하한입니다. |
noCursorTimeout | 서버가 비활성 기간(기본적으로 10분) 후에 커서에 시간 초과가 발생하는지 여부입니다. |
readConcern | 쿼리에 대한 읽기 고려 수준을 지정합니다. |
읽기 설정 | 쿼리에 대한 읽기 설정 수준을 지정합니다. |
returnKey | 쿼리에 대해 인덱스 키만 반환할지 여부입니다. |
showRecordId | $recordId 필드가 반환된 문서에 추가된 경우. $recordId 는 결과 집합에서 문서의 위치를 나타냅니다. |
건너뛰기 | 결과 집합에서 첫 번째 문서를 반환하기 전에 건너뛸 문서 수입니다. |
sort | 결과 집합에서 반환된 문서의 순서입니다. 정렬에 지정된 필드에는 인덱스가 있어야 합니다. |
tailable | 커서가 테일 커서인지 나타냅니다. 테일 커서는 쿼리의 초기 결과를 모두 소모한 후에도 계속 열린 상태로 유지됩니다. 테일 커서는 고정 사이즈 컬렉션에서만 사용할 수 있습니다. |
임베디드 필드 지정
내장된 문서의 필드에 대해서는 다음 둘 중 하나를 사용하여 필드를 지정할 수 있습니다.
점 표기법(예시:
"field.nestedfield": <value>
중첩된 양식, 예를 들어
{ field: { nestedfield: <value> } }
_id
필드 프로젝션
필드를 표시하지 않기 위해 프로젝션에서 _id: 0
을 명시적으로 지정하지 않는 한 _id
필드는 기본적으로 반환된 문서에 포함됩니다.
포함 또는 제외
projection
필드는 포함과 제외 사양을 모두 포함할 수 없습니다. 단, _id
필드는 예외입니다.
필드를 명시적으로 포함하는 프로젝션에서
_id
필드는 명시적으로 제외할 수 있는 유일한 필드입니다.필드를 명시적으로 제외하는 프로젝션에서는
_id
필드가 명시적으로 포함할 수 있는 유일한 필드이지만,_id
필드는 기본적으로 포함됩니다.
프로젝션 예시를 참조하세요.
Cursor Handling
mongosh
에서 db.collection.find()
를 실행하면 커서가 자동으로 반복되어 처음 20개 문서까지 표시합니다. 반복을 계속하려면 it
을 입력합니다.
드라이버를 사용하여 반환된 문서에 액세스하려면 드라이버 언어에 적합한 커서 처리 메커니즘을 사용하세요.
readConcern
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는 db.collection.find()
를 사용하여 를killOp
을 종료로 표시합니다.
쿼리 설정
버전 8.0에 추가 되었습니다.
쿼리 설정을 사용하여 인덱스 힌트를 설정하고, 작업 거부 필터 및 기타 필드를 설정할 수 있습니다. 해당 설정은 전체 클러스터의 쿼리 형태에 적용됩니다. 클러스터는 종료 후에도 설정을 유지합니다.
쿼리 옵티마이저는 쿼리 계획 중 추가 입력으로 쿼리 설정을 사용하여 쿼리를 실행할 계획에 영향을 미칩니다. 쿼리 설정을 사용하여 쿼리 형태를 차단할 수도 있습니다.
쿼리 설정을 추가하고 예시를 살펴보려면 setQuerySettings
를 참조하세요.
find
, distinct
및 aggregate
명령에 대한 쿼리 설정을 추가할 수 있습니다.
쿼리 설정은 더 많은 기능을 제공하며 더 이상 사용되지 않는 인덱스 필터보다 선호됩니다.
쿼리 설정을 제거 하려면 removeQuerySettings
를 사용합니다. 쿼리 설정을 가져오려면 집계 파이프라인 에서 $querySettings
단계를 사용합니다.
예시
이 섹션의 예시에서는 일반적으로 다음과 같은 문서 양식이 있는 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()
쿼리 기준과 일치하는 문서 찾기
동등에 대한 쿼리
다음 연산은
_id
가5
인 bios 컬렉션의 문서를 반환합니다.db.bios.find( { _id: 5 } ) 다음 작업은
name
내장된 문서의last
필드가"Hopper"
와 동일한 bios collection의 문서를 반환합니다:db.bios.find( { "name.last": "Hopper" } ) 참고
내장된 문서의 필드에 액세스하려면 점 표기법(
"<embedded document>.<field>"
)을 사용합니다.
연산자를 사용한 쿼리
일련의 선택 기준과 일치하는 문서를 찾으려면 find()
를 <criteria>
매개변수와 함께 호출합니다.
MongoDB는 기준을 지정하는 다양한 쿼리 연산자를 제공합니다.
다음 연산은
$in
연산자를 사용하여_id
가5
또는ObjectId("507c35dd8fada716c89d0013")
인 bios 컬렉션의 문서를 반환합니다.db.bios.find( { _id: { $in: [ 5, ObjectId("507c35dd8fada716c89d0013") ] } } ) 다음 작업은
$gt
연산자를 사용하여birth
가new 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/ } } )
쿼리 연산자 목록은 쿼리 선택기를 참조하세요.
범위 쿼리
비교 연산자를 결합하여 필드에 대한 범위를 지정합니다. 다음 작업은 birth
가 new 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 } } )
쿼리 연산자 목록은 쿼리 선택기를 참조하세요.
단일 문서에서 두 필드 비교
$expr
동일한 문서의 필드를 비교하는 표현식이 포함될 수 있습니다.
이 문서로 monthlyBudget
컬렉션을 만듭니다.
db.monthlyBudget.insertMany( [ { _id : 1, category : "food", budget : 400, spent : 450 }, { _id : 2, category : "drinks", budget : 100, spent : 150 }, { _id : 3, category : "clothes", budget : 100, spent : 50 }, { _id : 4, category : "misc", budget : 500, spent : 300 }, { _id : 5, category : "travel", budget : 200, spent : 650 } ] )
다음 작업은 $expr
를 사용하여 spent
금액이 budget
을 초과하는 문서를 찾습니다.
db.monthlyBudget.find( { $expr: { $gt: [ "$spent" , "$budget" ] } } )
출력:
{ _id : 1, category : "food", budget : 400, spent : 450 } { _id : 2, category : "drinks", budget : 100, spent : 150 } { _id : 5, category : "travel", budget : 200, spent : 650 }
내장된 문서 쿼리
다음 예시에서는 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
연산자를 사용하여 배열 요소에 여러 기준을 지정할 수 있습니다.
배열 쿼리에 대한 자세한 내용과 예시는 다음을 참조하세요.
배열별 쿼리 연산자 목록은 배열을 참조하세요.
BSON 정규 표현식 쿼리
BSON 정규 표현식을 값으로 포함하는 문서를 찾으려면 bsonRegExp
옵션을 true
로 설정하다 하여 find()
를 호출합니다. bsonRegExp
옵션을 사용하면 JavaScript 정규 표현식으로 표현할 수 없는 정규 표현식을 반환할 수 있습니다.
다음 작업은 foo
필드 값이 BSONRegExp
유형인 testbson
컬렉션의 문서를 반환합니다.
db.testbson.find( {}, {}, { bsonRegExp: true } )
[ { _id: ObjectId('65e8ba8a4b3c33a76e6cacca'), foo: BSONRegExp('(?-i)AA_', 'i') } ]
프로젝션
프로젝션 매개변수는 반환할 필드를 지정합니다. 매개변수에는 포함 또는 제외 사양이 있으며, _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
참고
프로젝션 문서 _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()
프로젝션은 집계 표현식과 구문을 사용할 수 있습니다.
집계 표현식과 구문을 사용하여 새 필드를 프로젝션하거나 기존 필드를 새 값으로 프로젝션할 수 있습니다. 예를 들어 다음 작업에서는 집계 표현식을 사용하여 name
및 awards
필드의 값을 재정의하고, 새 필드 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 }
반환된 커서 반복하기
mongosh
에서 반환된 커서가 var
키워드를 사용하여 변수에 할당되지 않은 경우 커서는 자동으로 반복되어 쿼리와 일치하는 처음 20개 문서까지 액세스합니다. displayBatchSize
변수를 업데이트하여 자동으로 반복되는 문서 수를 변경할 수 있습니다.
다음 예시에서는 배치 크기를 3으로 설정합니다. 이후의 db.collection.find()
연산에서는 문서를 커서 반복 1회당 3개만 반환합니다.
config.set( "displayBatchSize", 3 )
결과를 수동으로 반복하려면 다음 섹션과 같이 var
키워드를 사용하여 반환된 커서를 변수에 할당합니다.
변수 이름 사용
다음 예시에서는 변수 myCursor
를 사용하여 커서를 반복하고 일치하는 문서를 인쇄합니다.
var myCursor = db.bios.find( ); myCursor
메서드사용 next()
다음 예시에서는 커서 메서드 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()
다음 예시에서는 커서 메서드 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개의 문서를 반환합니다.
사용 가능한 mongosh
커서 메서드
let
옵션에서 변수 사용
쿼리 옵션을 지정하여 쿼리 동작을 수정하고 결과가 반환되는 방식을 지정할 수 있습니다.
예를 들어 find
메서드의 다른 곳에서 액세스할 수 있는 변수를 정의하려면 let
옵션을 사용합니다. 변수를 사용하여 결과를 필터링하려면 $expr
연산자 내에서 변수에 액세스해야 합니다.
컬렉션 cakeFlavors
을 만듭니다:
db.cakeFlavors.insertMany( [ { _id: 1, flavor: "chocolate" }, { _id: 2, flavor: "strawberry" }, { _id: 3, flavor: "cherry" } ] )
다음 예시에서는 let
에 targetFlavor
변수를 정의하고 이 변수를 사용하여 초콜릿 케이크 맛을 검색합니다.
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
컬렉션을 만들 수 있습니다.
사용자 만들기
필수 역할로 John
및 Jane
이라는 이름의 사용자를 만듭니다. 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" } ] } )
컬렉션 생성
실행:
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
에 액세스할 수 있는 문서를 검색하려면 다음 단계를 수행합니다.
문서 조회
시스템 변수를 사용하려면 변수 이름 시작 부분에 $$
를 추가합니다. USER_ROLES
시스템 변수를 $$USER_ROLES
로 지정합니다.
실행:
db.budget.find( { $expr: { $not: { $eq: [ { $setIntersection: [ "$allowedRoles", "$$USER_ROLES.role" ] }, [] ] } } } )
이전 예시에서는 예시를 실행하는 사용자가 가진 역할 중 하나 이상과 일치하는 budget
컬렉션의 문서를 반환합니다. 이를 위해 이 예시에서는 $setIntersection
을 사용하여 budget
문서 allowedRoles
필드와 $$USER_ROLES
의 사용자 역할 세트 사이의 교집합이 비어 있지 않은 문서를 반환합니다.
문서 검토
John
Marketing
, Operations
및 Development
역할이 있으며 다음과 같은 문서를 볼 수 있습니다.
[ { _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
에 액세스할 수 있는 문서를 검색하려면 다음 단계를 수행합니다.
문서 검토
Jane
은(는) Sales
및 Operations
역할을 가지며 다음과 같은 문서를 볼 수 있습니다.
[ { _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 )
AllowDisk옵션과 함께 사용
다음 쿼리는 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 } )