문제

페이지 매김에 필요한 쿼리를 구현하는 방법은 무엇입니까?

기본적으로 페이지 1이 요청되면 처음 5 개의 항목을 받으십시오. 2 페이지의 경우 다음 5 등을 얻으십시오.

CouchDB-Python 모듈을 통해 이것을 사용할 계획이지만 구현에 아무런 차이가 없습니다.

도움이 되었습니까?

해결책

그만큼 CouchDB 가이드 많은 샘플 코드를 포함하여 페이지 매김에 대한 좋은 논의가 있습니다. http://guide.couchdb.org/draft/recipes.html#pagination알고리즘은 다음과 같습니다.

  • 요구 rows_per_page + 1 보기에서 줄
  • 표시하다 rows_per_page 줄, 마지막 행을 저장하십시오 next_startkey
  • 페이지 정보로 유지하십시오 startkey 그리고 next_startkey
  • 사용 next_* 다음 링크를 생성하고 다른 링크를 사용하여 이전 링크를 작성하는 값

NB : CouchDB에서 페이지를 가져 오는 올바른 방법은 생각과 같은 시작 인덱스가 아니라 시작 키를 지정하는 것입니다. 그러나 두 번째 페이지를 시작할 열쇠를 어떻게 알 수 있습니까? 영리한 솔루션 : "페이지에 10 행을 요청하는 대신 11 행을 요청하지만 10 만 표시하고 11 번째 행의 값을 다음 페이지의 스타트키로 사용합니다."

여러 문서가 동일한 키를 방출 할 것으로 예상되면 사용해야합니다. startdocid 에 추가 startkey 올바르게 페이지를 찍습니다. 그 이유는 그 이유입니다 startkey 혼자서 더 이상 행을 고유하게 식별하기에 충분하지 않습니다. 해당 매개 변수는 a를 제공하지 않으면 쓸모가 없습니다 startkey. 실제로 CouchDB는 먼저 다음을 볼 것입니다 startkey 매개 변수는 다음을 사용합니다 startdocid 여러 잠재적 응시 행이 동일한 키이지만 문서 ID가 다른 경우 범위의 시작을 추가로 재정의하는 매개 변수. 똑같은 것 enddocid.

다른 팁

couchdb HTTP 뷰 API 효율적으로 페이징을 할 수있는 많은 범위를 제공합니다.

가장 간단한 방법이 사용됩니다 startkey 그리고 count. Count는 CouchDB가 해당보기 요청에 대해 반환되는 최대의 숫자입니다. 디자인에 달려 있으며 STARTKEY는 CouchDB가 시작하려는 곳입니다. 보기를 요청할 때는 또한 얼마나 많은 항목이 있는지 알려 주므로 사용자에게 표시하려는 경우 몇 페이지를 계산할 수 있습니다.

따라서 첫 번째 요청은 STARTKEY를 지정하지 않고 표시하려는 항목 수에 대한 수를 지정합니다. 그런 다음 마지막 항목의 키를 기록하고 다음 페이지의 시작 키로 사용할 수 있습니다. 이 간단한 형태로 한 페이지의 마지막 항목이 다음 중 첫 번째 항목이 여기에서 겹치게됩니다. 이것이 바람직하지 않다면 단순히 페이지의 마지막 항목을 표시하지 않는 것은 사소한 일입니다.

이 작업을 수행하는 간단한 방법은 Skip 매개 변수를 사용하여 페이지의 시작 문서를 작성하는 것이지만이 방법을주의해서 사용해야합니다. 스킵 매개 변수는 단순히 내부 엔진이 반복되는 항목을 반환하지 않도록합니다. 이것은 원하는 동작을 제공하지만 키별로 페이지의 첫 번째 문서를 찾는 것보다 훨씬 느립니다. 건너 뛸 수있는 문서가 많을수록 요청이 느려집니다.

이것이 내가 지금까지 제시 한 것입니다. 모든 게시물의 ID를 얻으려면 첫 번째 x 번호의 ID에 대한 실제 항목을 검색합니다.

그것은 매우 효율적이지는 않지만 모든 게시물을 검색 한 다음 대부분의 멀리 던지는 것보다 더 효율적입니다. 놀랍게도, 그것은 매우 빨리 달리는 것처럼 보였습니다. posthelper.page() 방법은 100 회이며 약 0.5 초가 걸렸습니다.

나는 이것을 실제 질문에 게시하고 싶지 않았으므로 답에 큰 영향을 미치지 않을 것입니다 - 여기에 코드가 있습니다.

allPostsUuid = """
function(doc) {
if(doc.type == 'post'){
    emit(doc._id, null);
}
}
"""

class PostsHelper:
    def __init__(self):
        server = Server(config.dbhost)
        db = server[config.dbname]
        return db


    def _getPostByUuid(self, uuid):
        return self.db.get(uuid)

    def page(self, number = 1):
        number -= 1 # start at zero offset
        start = number * config.perPage
        end = start + config.perPage

        allUuids = [
            x.key for x in self.db.query(allPostsUuid)
        ]
        ret = [
            self._getPostByUuid(x) for x in allUuids[start : end]
        ]

        if len(ret) == 0:
            raise Error404("Invalid page (%s results)" % (len(allUuids)))
        else:
            return ret
  • 다음은 내가 찾은 재귀 방식입니다.

    두 가지 변수를 사용하십시오

  var lastOffset = 0; var counter = 0;

  function someRecursive(lastOffset,counter) {

  queryView(db, whereClause).then(result => {
      var rows_per_page = 5; 

//formula below 
var page = Math.floor((lastOffset == 0 ? 0: (result.offset - lastOffset) +

  (rows_per_page * counter)) /  rows_per_page) + 1;

   var skip = page * rows_per_page;
  if (somerecursionexitcondition) {
                   counter = lastOffset == 0 ? lastOffset: counter + 1;
                   lastOffset =result.offset;
              someRecursive(lastOffset, counter).then(result => {
                               resolve();

                           });
  });

  }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top