복붙노트

[MONGODB] MongoDB를 - 페이징

MONGODB

MongoDB를 - 페이징

MongoDB를 사용하는 경우, 예를 들면 만들기위한 특별한 패턴이있다 페이징보기? 말을 목록 10 개 최신 게시물이 이전 게시물에 뒤로 탐색 할 수있는 블로그.

또는 하나의 예에 인덱스와 그것을 해결합니까 blogpost.publishdate 그냥 생략하고 결과를 제한?

해결법

  1. ==============================

    1.+ 제한을 건너 뛸 사용하면 성능이, 또는 대형 컬렉션에 문제가있을 때 페이징 할 수있는 좋은 방법 아니다; 당신은 페이지의 수를 증가로 속도가 느린 속도가 느린 얻을 것이다. 건너 뛰기를 사용하면 서버가 오프셋 (건너 뛰기) 값을 0에서 모든하지만 문서 (또는 인덱스 값을) 걸어해야합니다.

    + 제한을 건너 뛸 사용하면 성능이, 또는 대형 컬렉션에 문제가있을 때 페이징 할 수있는 좋은 방법 아니다; 당신은 페이지의 수를 증가로 속도가 느린 속도가 느린 얻을 것이다. 건너 뛰기를 사용하면 서버가 오프셋 (건너 뛰기) 값을 0에서 모든하지만 문서 (또는 인덱스 값을) 걸어해야합니다.

    그것은 훨씬 더 당신이 마지막 페이지의 범위 값을 전달 범위 쿼리 (+ 제한)를 사용하는 것입니다. 예를 들어, 당신은 쿼리에 대한 기준 데이터의 다음 페이지를 얻기 위해 당신이 간단한이 마지막 "publishdate"값을 전달할 것 "publishdate"으로 분류하는 경우.

  2. ==============================

    2.가능한 해결 방법 : 생각, 설계를 단순화하려고 우리는 일종의 ID 또는 몇 가지 고유 한 값으로 할 수 있다면?

    가능한 해결 방법 : 생각, 설계를 단순화하려고 우리는 일종의 ID 또는 몇 가지 고유 한 값으로 할 수 있다면?

    우리가 할 수있는 경우에, 다음을 기반으로 수신 거리 페이징을 사용할 수 있습니다.

    일반적인 방법은 사용 정렬 (), 건너 뛰기 ()와 위에서 설명한 무엇 페이징을 구현하는 제한 ()입니다.

  3. ==============================

    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. ==============================

    4.범위를 기반으로 페이징이 가능 하죠,하지만 당신은 쿼리 최소 / 최대 방법에 대한 스마트해야합니다.

    범위를 기반으로 페이징이 가능 하죠,하지만 당신은 쿼리 최소 / 최대 방법에 대한 스마트해야합니다.

    당신이 당신에게 줄 수있는 경우에해야 임시 파일이나 컬렉션의 쿼리 결과를 캐시하려고합니다. MongoDB를 당신의 TTL 컬렉션 덕분에 두 개의 컬렉션으로 결과를 삽입 할 수 있습니다.

    의 TTL 현재 시간 가까이 때 부분적인 결과를 얻을 수 없습니다 모두 보증한다 사용. 당신이 결과를 저장할 때 그 시점에서 매우 간단한 범위 쿼리를 수행하는 간단한 카운터를 이용할 수있다.

  5. ==============================

    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. ==============================

    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
    
  7. from https://stackoverflow.com/questions/5049992/mongodb-paging by cc-by-sa and MIT license