programing

MongoDB에서 범위 쿼리를 사용하여 페이지화를 수행하는 방법은 무엇입니까?

mailnote 2023. 7. 15. 10:26
반응형

MongoDB에서 범위 쿼리를 사용하여 페이지화를 수행하는 방법은 무엇입니까?

아직 MongoDB의 내용을 배우고 있기 때문에 누락된 부분이 있을 수 있습니다만, 콜렉션 페이징에 대한 도움이 필요합니다.

이름 목록이 있는 컬렉션이 있습니다.

소고기 밑면 라운드
닭가슴살 6oz
닭가슴살 8oz
닭가슴살 8oz
닭가슴살 8oz
닭가슴살 랜덤
닭다리
닭 안심
닭다리
코셔 솔트

"ProductName,_id"에 복합 인덱스를 작성했습니다.

다음 쿼리를 실행합니다.

db.ProductGuideItem.find( { ProductName: { $gt: "Chicken Breast 8oz" } } ).sort({ProductName:1,_id:1}).limit(3); 

3가지 "닭가슴살 8oz" 아이템이 있습니다.

그 쿼리를 실행하면...
닭가슴살 랜덤
닭다리
닭 안심

만약 내가 호출을 하고 처음부터 시작했다면요.질문은 다른 2개의 "닭 가슴 8oz"를 놓쳤을 것입니다.

그래서 각 페이지에 3개의 항목만 있을 수 있고 제가 2페이지를 보고 싶다면 저는 봐야 합니다.
닭가슴살 8oz
닭가슴살 8oz
닭가슴살 랜덤.

하지만 난 아닙니다.마지막 닭가슴살 8oz까지 가서 거기서부터 시작합니다.

이 일을 피할 방법이 있습니까?
또한 목록이 반대로 정렬된 경우에는 어떻게 해야 합니까?

페이징하던 컬렉션에 중복된 값이 있었기 때문에 ProductName과 id에 복합 인덱스를 만들어야 했습니다.

복합 인덱스 만들기

db.ProductGuideItem.ensureIndex({ ProductName:1, _id:1});

이것으로 저의 문제가 해결되었습니다.
참조: https://groups.google.com/d/msg/mongodb-user/3EZZIRJzW_A/oYH79npKZHkJ

다음 값이 있다고 가정합니다.

{a:1, b:1}
{a:2, b:1}
{a:2, b:2}
{a:2, b:3}
{a:3, b:1}

범위 기반 페이지에 대해 다음 작업을 수행합니다(페이지 크기 2).

첫 페이지

find().sort({a:1, b:1}).limit(2)
{a:1, b:1}
{a:2, b:1}

두 번째 페이지

find().min({a:2, b:1}).sort({a:1, b:1}).skip(1).limit(2)

{a:2, b:2}
{a:2, b:3}

세 번째 페이지

find().min({a:2, b:3}).sort({a:1, b:1}).skip(1).limit(2)
{a:3, b:1}

$min/max에 대한 문서는 다음과 같습니다. http://www.mongodb.org/display/DOCS/min+and+max+Query+Specifiers

컬렉션에 중복 값이 없으면 최소값 & 최대값을 사용하거나 복합 인덱스를 만들 필요가 없습니다.$lt & $gt;만 사용할 수 있습니다.

아래 코드는 첫 번째 페이지에서 10개의 문서를 반환하며 나머지 페이지에서도 마찬가지입니다.

const perPage = 10 //10docs in single page
const page = 1 //1st page
db.collection.find({}).skip(perPage * page).limit(perPage)

언급URL : https://stackoverflow.com/questions/5525304/how-to-do-pagination-using-range-queries-in-mongodb

반응형