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
});
});
});