[MONGODB] MongoDB를 - 페이징
MONGODBMongoDB를 - 페이징
MongoDB를 사용하는 경우, 예를 들면 만들기위한 특별한 패턴이있다 페이징보기? 말을 목록 10 개 최신 게시물이 이전 게시물에 뒤로 탐색 할 수있는 블로그.
또는 하나의 예에 인덱스와 그것을 해결합니까 blogpost.publishdate 그냥 생략하고 결과를 제한?
해결법
-
==============================
1.+ 제한을 건너 뛸 사용하면 성능이, 또는 대형 컬렉션에 문제가있을 때 페이징 할 수있는 좋은 방법 아니다; 당신은 페이지의 수를 증가로 속도가 느린 속도가 느린 얻을 것이다. 건너 뛰기를 사용하면 서버가 오프셋 (건너 뛰기) 값을 0에서 모든하지만 문서 (또는 인덱스 값을) 걸어해야합니다.
+ 제한을 건너 뛸 사용하면 성능이, 또는 대형 컬렉션에 문제가있을 때 페이징 할 수있는 좋은 방법 아니다; 당신은 페이지의 수를 증가로 속도가 느린 속도가 느린 얻을 것이다. 건너 뛰기를 사용하면 서버가 오프셋 (건너 뛰기) 값을 0에서 모든하지만 문서 (또는 인덱스 값을) 걸어해야합니다.
그것은 훨씬 더 당신이 마지막 페이지의 범위 값을 전달 범위 쿼리 (+ 제한)를 사용하는 것입니다. 예를 들어, 당신은 쿼리에 대한 기준 데이터의 다음 페이지를 얻기 위해 당신이 간단한이 마지막 "publishdate"값을 전달할 것 "publishdate"으로 분류하는 경우.
-
==============================
2.가능한 해결 방법 : 생각, 설계를 단순화하려고 우리는 일종의 ID 또는 몇 가지 고유 한 값으로 할 수 있다면?
가능한 해결 방법 : 생각, 설계를 단순화하려고 우리는 일종의 ID 또는 몇 가지 고유 한 값으로 할 수 있다면?
우리가 할 수있는 경우에, 다음을 기반으로 수신 거리 페이징을 사용할 수 있습니다.
일반적인 방법은 사용 정렬 (), 건너 뛰기 ()와 위에서 설명한 무엇 페이징을 구현하는 제한 ()입니다.
-
==============================
3.내 컬렉션은 단일 쿼리에 반환하기에 너무 큰 성장 때 야그 솔루션 내가 사용. 그것은 _id 필드의 고유 한 주문을 활용하고 지정된 배치 크기로 컬렉션을 루프를 할 수 있습니다.
내 컬렉션은 단일 쿼리에 반환하기에 너무 큰 성장 때 야그 솔루션 내가 사용. 그것은 _id 필드의 고유 한 주문을 활용하고 지정된 배치 크기로 컬렉션을 루프를 할 수 있습니다.
여기에서는, 전체 코드 아래 인 NPM 모듈 몽구스 페이징과 같다 :
function promiseWhile(condition, action) { return new Promise(function(resolve, reject) { process.nextTick(function loop() { if(!condition()) { resolve(); } else { action().then(loop).catch(reject); } }); }); } function findPaged(query, fields, options, iterator, cb) { var Model = this, step = options.step, cursor = null, length = null; promiseWhile(function() { return ( length===null || length > 0 ); }, function() { return new Promise(function(resolve, reject) { if(cursor) query['_id'] = { $gt: cursor }; Model.find(query, fields, options).sort({_id: 1}).limit(step).exec(function(err, items) { if(err) { reject(err); } else { length = items.length; if(length > 0) { cursor = items[length - 1]._id; iterator(items, function(err) { if(err) { reject(err); } else { resolve(); } }); } else { resolve(); } } }); }); }).then(cb).catch(cb); } module.exports = function(schema) { schema.statics.findPaged = findPaged; };
이 같은 모델에 연결합니다 :
MySchema.plugin(findPaged);
다음과 같은 질의 :
MyModel.findPaged( // mongoose query object, leave blank for all {source: 'email'}, // fields to return, leave blank for all ['subject', 'message'], // number of results per page {step: 100}, // iterator to call on each set of results function(results, cb) { console.log(results); // this is called repeatedly while until there are no more results. // results is an array of maximum length 100 containing the // results of your query // if all goes well cb(); // if your async stuff has an error cb(err); }, // function to call when finished looping function(err) { throw err; // this is called once there are no more results (err is null), // or if there is an error (then err is set) } );
-
==============================
4.범위를 기반으로 페이징이 가능 하죠,하지만 당신은 쿼리 최소 / 최대 방법에 대한 스마트해야합니다.
범위를 기반으로 페이징이 가능 하죠,하지만 당신은 쿼리 최소 / 최대 방법에 대한 스마트해야합니다.
당신이 당신에게 줄 수있는 경우에해야 임시 파일이나 컬렉션의 쿼리 결과를 캐시하려고합니다. MongoDB를 당신의 TTL 컬렉션 덕분에 두 개의 컬렉션으로 결과를 삽입 할 수 있습니다.
의 TTL 현재 시간 가까이 때 부분적인 결과를 얻을 수 없습니다 모두 보증한다 사용. 당신이 결과를 저장할 때 그 시점에서 매우 간단한 범위 쿼리를 수행하는 간단한 카운터를 이용할 수있다.
-
==============================
5.여기 CreatedDate하여 사용자 문서 순위 목록을 검색하는 예는 공식 C # 1 드라이버를 사용하여 (pageIndex가 제로 기반).
여기 CreatedDate하여 사용자 문서 순위 목록을 검색하는 예는 공식 C # 1 드라이버를 사용하여 (pageIndex가 제로 기반).
public void List<User> GetUsers() { var connectionString = "<a connection string>"; var client = new MongoClient(connectionString); var server = client.GetServer(); var database = server.GetDatabase("<a database name>"); var sortBy = SortBy<User>.Descending(u => u.CreatedDate); var collection = database.GetCollection<User>("Users"); var cursor = collection.FindAll(); cursor.SetSortOrder(sortBy); cursor.Skip = pageIndex * pageSize; cursor.Limit = pageSize; return cursor.ToList(); }
모든 정렬 및 페이징 작업은 서버 측에서 수행됩니다. 이 C #의 예이지만, 나는 같은 다른 언어 포트에 적용 할 수있는 것 같아요.
http://docs.mongodb.org/ecosystem/tutorial/use-csharp-driver/#modifying-a-cursor-before-enumerating-it를 참조하십시오.
-
==============================
6.
// file:ad-hoc.js // an example of using the less binary as pager in the bash shell // // call on the shell by: // mongo localhost:27017/mydb ad-hoc.js | less // // note ad-hoc.js must be in your current directory // replace the 27017 wit the port of your mongodb instance // replace the mydb with the name of the db you want to query // // create the connection obj conn = new Mongo(); // set the db of the connection // replace the mydb with the name of the db you want to query db = conn.getDB("mydb"); // replace the products with the name of the collection // populate my the products collection // this is just for demo purposes - you will probably have your data already for (var i=0;i<1000;i++ ) { db.products.insert( [ { _id: i, item: "lamp", qty: 50, type: "desk" }, ], { ordered: true } ) } // replace the products with the name of the collection cursor = db.products.find(); // print the collection contents while ( cursor.hasNext() ) { printjson( cursor.next() ); } // eof file: ad-hoc.js
from https://stackoverflow.com/questions/5049992/mongodb-paging by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] 왜 Node.js를 코드에서 MongoDB를 연결 어느 곳을 폐쇄하지 않는 것이 좋습니다? (0) | 2019.12.02 |
---|---|
[MONGODB] 오버플로 정렬 단계 버퍼링 된 데이터의 사용은 내부 한계를 초과 (0) | 2019.12.02 |
[MONGODB] 이해 MongoDB를 BSON 문서 크기 제한 (0) | 2019.12.02 |
[MONGODB] MongoDB의 모든 쿼리를 로깅 (0) | 2019.12.02 |
[MONGODB] 모바일 또는 브라우저 기반 응용 프로그램에서 MongoDB를 연결 (0) | 2019.12.02 |