Как получить общее количество просмотров в Couchbase Views

Когда я запрашиваю некоторое представление в Couchbase, используя параметр user_id (key), limit (10) и skip (0), я получаю ответ, который имеет следующую структуру:

{
  "total_rows":1896,
  "rows":[...]
}

Вот мое мнение, кто возвращает список отчетов на основе user_id: -

function map(doc, meta) {
    if (doc.type == 'report' && doc.subscribed) {
        for (var subscriber in doc.subscribed) {
            emit(subscriber, doc);
        }
    }
}

вот пример документа отчета: -

{
   "agree_allowed":true,
   "assigned_by":"",
   "assigned_to":"",
   "closed":[

   ],
   "comments_allowed":true,
   "details":"Test",
   "email":"",
   "status":"In Progress",
   "subscribed":{
      "user_cfd29b81f0263a380507":true,
      "user_cfd29b81f0263a380508":true,
      "user_cfd29b81f0263a380509":true,
      "user_cfd29b81f0263a3805010":true
   },
   "summary":"Test",
   "time_open":0,
   "timestamp":"2015-07-17T15:34:30.864Z",
   "type":"report",
   "user_id":"user_cfd29b81f0263a380507",
   "username":"test17"
}

но количество строк равно 3, поэтому, если я хочу добиться разбивки на страницы, как я могу получить общее количество, так что это может быть полезно для разбивки на страницы.


person rash111    schedule 30.07.2015    source источник
comment
что вы имеете в виду, но количество строк равно 3?   -  person Simon Baslé    schedule 30.07.2015
comment
длина строк 3, содержит 3 отчета   -  person rash111    schedule 30.07.2015
comment
ваш пример документа содержит 4 элемента в массиве subscribed, что меня сбило с толку.   -  person Simon Baslé    schedule 30.07.2015


Ответы (1)


total_rows содержит нефильтрованное количество, поэтому оно должно быть равно общему количеству subscribed записей (всех [user,report] пар).

если вы хотите сделать эффективную разбивку на страницы, вам не следует использовать skip(n), потому что это заставляет индекс сканировать n первых строк и отбрасывать их.

вместо этого вы должны использовать startkey, startkey_docid и limit (ну, на самом деле вы бы использовали skip(1), чтобы избавиться от последнего результата предыдущей страницы).

это довольно подробно объясняется в этом сообщении в блоге: http://blog.couchbase.com/pagination-couchbase

person Simon Baslé    schedule 30.07.2015