
await db.collection('post').find().limit(5).toArray()
await db.collection('post').find().skip(5).limit(5).toArray()
app.get('/list/:id', async (요청, 응답) => {
let result = await db.collection('post').find()
.skip( (요청.params.id - 1) * 5 ).limit(5).toArray()
응답.render('list.ejs', { 글목록 : result })
})
skip() 안에 100만 이상의 숫자를 넣으면 매우 오래걸린다.
document를 하나하나 세어서 수행해주기 때문
페이지네이션 기능 만들 때 간단한 사이트에선 괜찮은데 너무 많은 게시물을 스킵하는 것은 if문 써서 금지시켜놓는 등 해야한다.
await db.collection('post').find({_id : {$gt : 방금본 마지막게시물_id}}).limit(5).toArray()
방금 본 마지막 게시물_id보다 큰 것에서 5개 가져오기때문에
지금 보는 게시물에서 다음 게시물 5개를 가져올 수 있다.
단점은 페이지네이션 버튼을 다음버튼으로 바꿔야한다. 다음게시물만 가져올 수 있기 때문이다.
<a href="/list/next/<%= 글목록[글목록.length - 1]._id %>">다음</a>
app.get('/list/next/:id', async (요청, 응답) => {
let result = await db.collection('post').find({_id : {$gt : new ObjectId(요청.params.id) }}).limit(5)
응답.render('list.ejs', { 글목록 : result })
})
예를 들어 1001~1005번 글이 필요하면
db.collection('post').find({_id : { $gt : 1000 }}).limit(5)
_id를 정수로 부여하려면 auto increment 해야한다.
글의 정확한 순서나 번호가 크게 중요한 서비스는 거의 없다. 예를 들면 쇼핑몰을 운영하는데 10000번째 등록된 상품을 출력해달라고 요청하는 고객은 없을 것이다.
글의 _id나 순서가 정수로 꼭 필요한지는 한 번 생각해볼 필요가 있다.
counter 라는 이름의 컬렉션을 만들기
{ _id : 자동부여된거, count : 0 } document 발행
게시물을 하나 발행할 때 마다
counter 컬렉션에 있던 document 를 찾아와서 count : 에 기재된 값을 출력
그 값에 +1을 한 다음 그걸 _id란에 기입해서 새로운 글을 발행
성공적으로 발행된걸 확인하면 updateOne으로 counter 컬렉션의 document에 있던 count : 항목을 +1 해준다.
trigger 기능을 쓰는게 더 정확하게 잘되기 때문에 (https://www.mongodb.com/basics/mongodb-auto-increment)
시간이 많으면 이걸로 해보자.