couchdbcouchdb-nano

Sorting CouchDB result by unix timestamp and paginate


I am struggeling to get pagination working for a few days now. I have a database with docs and have a few to have the timestamp as key to sort descending. But I can't seem to get the next set of docs ...

If I run it, I get the top 5 docs. When I try to use startkey or startkey_docid I only seem to get the same lines again.

Trying the couch documentation I am not sure what I need to make it work.

couchdb has a design like:

{
  "_id": "_design/filters",
  "views": {
    "blog": {
      "map": "function (doc) { if (doc.published && doc.type == 'post') emit(doc.header.date); }"
    }
  }
}

... header.date is generated with +new Date()

on the nodejs side, with github/nano, I use something similar to:

import nano from 'nano';

let db = nano(SERVICE_URL).use('blog_main');

let lastDocId = ctx.query.lastDocId;
let lastSkip = ctx.query.lastSkip ? +ctx.query.lastSkip + 5 : null;

let query = {
    limit: 1 + 4,       // limit to 5
    descending: true,   // reverse order: newest to top
    include_docs: true,
}
if (lastDocId) { // initally off
    query.startkey = lastDocId;
}
if (lastSkip) { // other method for tests
    query.skip = lastSkip;  //  ----> this results in some previous and some new items
}

let itemRows = await db.view('filters','blog', query);
let items = itemRows.rows;
// each doc is in items[].doc

I have seen sort by value, sorting works for me - but I cant seem to get pagination to work.


Solution

  • Using startkey or skip, returned results that included some of the skipped results as well, or all previous ones (strangely mixed up).

    I solved it, by extending the result keys with - second part. Since the key was based on a date without time, it seemed to have rearranged the entries on each request due to similar date-timestamps. Adding a second part that was was sortable as well (used the created timestamp as second part) fixed it. The key is now [datetimestamp, createdtimestamp] .. both can be sorted descending.