- 알면 유용한 것에 대한 고민 끝에 Cursor 에 대해 알아 두면 좋지 않을까 하여 공유 드립니다.
Cursor
- 쿼리 결과에 대한 포인터
- find 명령어는 결과로 Document를 반환하지 않고 Cursor를 반환
- Cursor Methods
Name |
Description |
memo |
쿼리 동작을 수정하는 특별한 protocol flag 를 추가 |
|
|
Sort 명령어를 사용하여, 쿼리 결과 정렬 작업을 처리하는 동안, 100 Mb 메모리를 초과하여 Disk Temporary files를 사용한 내역 -------------------------------------------------------------------------------- MongoDB의 Aggregate() 명령은 기본적으로 정렬을 위해서 100mb 메모리까지 사용 가능. 만약 그 이상의 데이터를 정렬해야 하는 경우라면 Aggregate() 명령은 실패-> 이 때 allowDiskUse 옵션을 true로 설정 시 Aggregate()처리가 디스크를 이용해 정렬 가능. 이 때 MongoDB 데이터 Directory 하의에 "_temp" Diretory 를 만들어 임시 가공용 데이터 파일을 저장 |
Real MongoDB-702p 참고
$ db.user_scores.aggregate([ {$match:{score:{$gt:50}}}, {$group:{_id:"$name",avg:{$avg:"$score"}}} ],{allowDiskUse:True}) |
|
find 명령어를 사용하여 샤딩된 collection의 작업을 진행 중 오류로 인해 조회를 못하게 되는 경우, 부분적인 결과만 이라도 조회 |
|
|
Single network 메시지에서, MongoDB에서 Client로 결과를 내보낸 document 수 |
|
|
cursor close. (리소스까지 비움) |
|
|
리턴이 성공하면 cursor를 close |
|
|
find()에 의해 리턴된 커서의 collection 을 지정 |
|
|
system.profile Collection에서 로그 및 시스템에서 실행한 쿼리를 추적하기 위해 쿼리에 설명 추가(주석) |
|
|
커서에서 결과 Document의 count |
|
|
커서에서 쿼리 실행결과 보고 |
|
|
커서에서 모든 Document에 대한 JavaScript 함수를 적용 |
|
|
Cursor 내 반환할 Document가 존재하면 True 를 리턴 |
|
|
쿼리에 특정 인덱스를 사용 |
|
|
커서가 닫혀 있고, 배치에 남아있는 Document가 없는 경우 true를 반환 |
|
|
커서 내 클라이언트로 제공할 Document의 수를 계산 (find().count()와 유사하지만, cursor에서 사용하는 영역?) |
|
|
cursor document 결과 를 제한 |
|
|
커서 결과 Document를 함수에 적용하고, 그 결과 값을 배열(Array) 형태로 저장 |
db.users.find().map( function(u) { return u.name; } ); -> forEach와 유사 |
|
find 필드 값에 대한 max 값을 지정. cursor.hint()와 함께 사용 |
|
|
cursor 작업의 누적 시간 제한 (ms) |
|
|
find 필드 값에 대한 min 값을 지정. cursor.hint()와 함께 사용 |
|
|
cursor 내에서 다음 Document 를 반환 |
|
|
cursor 자동 닫힘의 Timeout 을 비활성화 |
|
|
현재 cursor 내 남아있는 document 수를 반환 |
|
|
cursor 결과를 읽기 쉽게 표시 |
|
|
find() 명령어에 대한 readConcern 을 지정 |
|
|
레플리카셋에서 클라이언트가 다이렉트로 읽을 수 있도록 cursor 설정 |
|
|
Document가 아닌 인덱스 key를 반환하도록 커서를 수정 |
|
|
결과 Document 에 내부 엔진 ID 필드를 추가 |
|
|
skip()와 limit() 를 적용한 커서내 결과 Document count 를 리턴 |
|
|
커서 내 Document에서 skip 또는 패스한 후의 결과를 리턴 |
|
|
정렬값에 의해 정렬된 결과를 리턴 |
|
|
capped collection에서 커서에 tail 하여 제공 (마지막 내역만 계속 공유?) |
|
|
커서에 의해 반환된 Document를 배열로 반환 |
|
cursor.forEach()
- 예전 검색해서 저장해 놓은 쿼리
db.getCollectionNames().forEach(function(collection) {
indexes = db[collection].getIndexes();
print("Indexes for " + collection + ":");
printjson(indexes);
});
cursor.itcount()
> db.SentMessages.find({Type : 'Foo'})
{ "_id" : ObjectId("53ea19af9834184ad6d3675a"), "Name" : "123", "Type" : "Foo" }
{ "_id" : ObjectId("53ea19dd9834184ad6d3675c"), "Name" : "789", "Type" : "Foo" }
{ "_id" : ObjectId("53ea19d29834184ad6d3675b"), "Name" : "456", "Type" : "Foo" }
> db.SentMessages.find({Type : 'Foo'}).count()
3
> db.SentMessages.find({Type : 'Foo'}).limit(1)
{ "_id" : ObjectId("53ea19af9834184ad6d3675a"), "Name" : "123", "Type" : "Foo" }
> db.SentMessages.find({Type : 'Foo'}).limit(1).count();
3
> db.SentMessages.aggregate([ { $match : { Type : 'Foo'}} ])
{ "_id" : ObjectId("53ea19af9834184ad6d3675a"), "Name" : "123", "Type" : "Foo" }
{ "_id" : ObjectId("53ea19dd9834184ad6d3675c"), "Name" : "789", "Type" : "Foo" }
{ "_id" : ObjectId("53ea19d29834184ad6d3675b"), "Name" : "456", "Type" : "Foo" }
> db.SentMessages.aggregate([ { $match : { Type : 'Foo'}} ]).count()
2014-08-12T14:47:12.488+0100 TypeError: Object #<Object> has no method 'count'
> db.SentMessages.aggregate([ { $match : { Type : 'Foo'}} ]).itcount()
3
> db.SentMessages.aggregate([ { $match : { Type : 'Foo'}}, {$limit : 1} ])
{ "_id" : ObjectId("53ea19af9834184ad6d3675a"), "Name" : "123", "Type" : "Foo" }
> db.SentMessages.aggregate([ { $match : { Type : 'Foo'}}, {$limit : 1} ]).itcount()
1
> exit
bye
batchSize 와 Limit 비교
- 참고(복붙이나 다름 없습니다.) : https://emflant.tistory.com/12
- batchSize : 한 batch 당 가져오는 document 갯수.
- limit : 쿼리의 결과로 가져올 총 갯수.
- limit 와 batchSize 를 지정하지 않는 경우 batch는 한번 당 101개의 Document 결과를 리턴 하지만, Document 당 너무 많은 데이터가 있는 경우 batch 한번 당 1Mb 가 최대 size
- limit 와 batchSize 를 지정하는 경우, 지정한 수만큼 리턴
- 큰 수로 셋팅하더라도 4Mb 이상의 데이터를 한번의 Batch로 가져올 수 없음.
- 인덱스 없이 데이터를 sort하는 경우 첫 번째 batch에 모든 데이터를 가져오지만, 최대 4 Mb 초과할 수 없음.
> // for문을 돌려서 간단한 데이터로 200개 document 를 등록한다.
> for (var i = 0; i < 200; i++) { db.foo.insert({i: i}); }
> var cursor = db.foo.find()
> // batchSize나 limit 값 지정없이 find 했으므로 기본 batch 크기인 101 documents
> cursor.objsLeftInBatch()
101
> // 한번에 모든 document들을 가져오기 위해 큰 limit 값을 셋팅하면 batchSize는 모든 document 수가 된다.
> var cursor = db.foo.find().limit(1000)
> cursor.objsLeftInBatch()
200
> // batchSize 가 limit 크기보다 작으면 batchSize가 우선한다.
> var cursor = db.foo.find().batchSize(10).limit(1000)
> cursor.objsLeftInBatch()
10
> // limit 가 batchSize 보다 작으면 limit 가 우선한다.
> var cursor = db.foo.find().batchSize(10).limit(5)
> cursor.objsLeftInBatch()
5
> // 각각 1MB 데이터로 10개의 document 를 등록한다.
> var megabyte = '';
> for (var i = 0; i < 1024 * 1024; i++) { megabyte += 'a'; }
> for (var i = 0; i < 10; i++) { db.bar.insert({s:megabyte}); }
> // limit나 batchSize를 지정하지 않았으므로 첫번째 batch는 1MB 에서 멈춘다.
> // 결국 1개씩 반복적으로 데이터를 가져오게됨
> var cursor = db.bar.find()
> cursor.objsLeftInBatch()
1
'MongoDB > MongoDB-Study_완료' 카테고리의 다른 글
[MongoDB][Study-7] Find / FindAndModify / Cursor (0) | 2021.03.28 |
---|---|
[MongoDB] [Study-6] MongoDB CRUD 쓰기 연산 (0) | 2021.03.28 |
[MongoDB][Study-4] MongoDB 기본 명령어 익히기 (0) | 2021.03.27 |
[MongoDB][Study-3] Sharding (0) | 2021.03.27 |
[MongoDB] [Study-2-2] P-S-A 구성 (0) | 2021.03.27 |