[mongodb] Node.js에서 Mongoose로 페이지 매김하는 방법?

Node.js와 mongoose로 webapp을 작성 중입니다. .find()전화로 얻은 결과를 어떻게 매김 할 수 있습니까? "LIMIT 50,100"SQL 과 비슷한 기능을 원합니다 .



답변

이 질문에 대한 대답에 매우 실망했습니다. 이것은 확장되지 않습니다. cursor.skip ()의 작은 글씨를 읽는 경우 :

cursor.skip () 메소드는 결과를 리턴하기 전에 오프셋 또는 건너 뛰기 위치를 얻기 위해 서버가 콜렉션 또는 인덱스의 시작에서 걸어 가야하기 때문에 종종 비용이 많이 듭니다. 오프셋 (예 : pageNumber)이 증가함에 따라 cursor.skip ()가 느려지고 CPU를 많이 사용하게됩니다. 더 큰 컬렉션을 사용하면 cursor.skip ()가 IO 바인딩 될 수 있습니다.

확장 가능한 방식으로 페이지 매김을 달성하기 위해 limit ()를 하나 이상의 필터 기준과 결합하면 createdOn 날짜가 많은 목적에 적합합니다.

MyModel.find( { createdOn: { $lte: request.createdOnBefore } } )
.limit( 10 )
.sort( '-createdOn' )


답변

Rodolphe가 제공 한 정보로 Mongoose API를 자세히 살펴본 후이 솔루션을 찾았습니다.

MyModel.find(query, fields, { skip: 10, limit: 5 }, function(err, results) { ... });


답변

몽구스, 표현 및 옥을 사용한 페이지 매김- 자세한 내용은 내 블로그에 대한 링크입니다.

var perPage = 10
  , page = Math.max(0, req.param('page'))

Event.find()
    .select('name')
    .limit(perPage)
    .skip(perPage * page)
    .sort({
        name: 'asc'
    })
    .exec(function(err, events) {
        Event.count().exec(function(err, count) {
            res.render('events', {
                events: events,
                page: page,
                pages: count / perPage
            })
        })
    })


답변

다음과 같이 체인으로 연결할 수 있습니다.

var query = Model.find().sort('mykey', 1).skip(2).limit(5)

다음을 사용하여 쿼리를 실행하십시오. exec

query.exec(callback);


답변

이 경우 검색어를 추가 page하거나limit URL에 쿼리 문자열로 .

예를 들면 다음과 같습니다.
?page=0&limit=25 // this would be added onto your URL: http:localhost:5000?page=0&limit=25

그것이 계산 이기 때문에 그것을 String로 변환해야합니다 Number. 를 사용하여 해보자parseInt메소드를 일부 기본값도 제공하겠습니다.

const pageOptions = {
    page: parseInt(req.query.page, 10) || 0,
    limit: parseInt(req.query.limit, 10) || 10
}

sexyModel.find()
    .skip(pageOptions.page * pageOptions.limit)
    .limit(pageOptions.limit)
    .exec(function (err, doc) {
        if(err) { res.status(500).json(err); return; };
        res.status(200).json(doc);
    });

BTW
페이지 매김 시작0


답변

Mongoose Paginate 라는 작은 패키지 를 사용하면 쉽게 만들 수 있습니다.

$ npm install mongoose-paginate

라우트 또는 컨트롤러에서 다음을 추가하십시오.

/**
 * querying for `all` {} items in `MyModel`
 * paginating by second page, 10 items per page (10 results, page 2)
 **/

MyModel.paginate({}, 2, 10, function(error, pageCount, paginatedResults) {
  if (error) {
    console.error(error);
  } else {
    console.log('Pages:', pageCount);
    console.log(paginatedResults);
  }
}


답변

이것은 당신이 이것을 시도 할 수있는 샘플 예입니다.

var _pageNumber = 2,
  _pageSize = 50;

Student.count({},function(err,count){
  Student.find({}, null, {
    sort: {
      Name: 1
    }
  }).skip(_pageNumber > 0 ? ((_pageNumber - 1) * _pageSize) : 0).limit(_pageSize).exec(function(err, docs) {
    if (err)
      res.json(err);
    else
      res.json({
        "TotalCount": count,
        "_Array": docs
      });
  });
 });