按unix时间戳和分页对CouchDB结果排序

按unix时间戳和分页对CouchDB结果排序,couchdb,couchdb-nano,Couchdb,Couchdb Nano,我现在正在努力让分页工作几天。我有一个包含文档的数据库,还有一些是以时间戳作为排序键的。但我似乎无法获得下一套文档 如果我运行它,我会得到前5个文档。当我尝试使用startkey或startkey\u docid时,我似乎只得到了相同的行 尝试沙发文档我不确定我需要什么使它工作 couchdb的设计如下: { “_id”:“_设计/过滤器”, “意见”:{ “博客”:{ “映射”:“函数(doc){if(doc.published&&doc.type=='post')发出(doc.header.

我现在正在努力让分页工作几天。我有一个包含文档的数据库,还有一些是以时间戳作为排序键的。但我似乎无法获得下一套文档

如果我运行它,我会得到前5个文档。当我尝试使用startkey或startkey\u docid时,我似乎只得到了相同的行

尝试沙发文档我不确定我需要什么使它工作

couchdb的设计如下:

{
“_id”:“_设计/过滤器”,
“意见”:{
“博客”:{
“映射”:“函数(doc){if(doc.published&&doc.type=='post')发出(doc.header.date);}”
}
}
}
<代码>标题。日期由
+新日期()生成。

在nodejs端,我使用类似于:

从“nano”导入nano;
让db=nano(SERVICE_URL),使用('blog_main');
让lastDocId=ctx.query.lastDocId;
让lastSkip=ctx.query.lastSkip+ctx.query.lastSkip+5:空;
让查询={
限制:1+4,//限制为5
降序:true,//倒序:最新到顶部
包含文档:true,
}
if(lastDocId){//初始关闭
query.startkey=lastDocId;
}
if(lastSkip){//其他测试方法
query.skip=lastSkip;//--->这将导致一些以前的项目和一些新项目
}
让itemrrows=wait db.view('filters','blog',query);
让items=itemrrows.rows;
//每个单据都在项目[]中。单据

我已经看到,排序对我来说很有效——但我似乎无法让分页正常工作。

对于“我又得到了相同的行”这句话,我不确定。如果
startkey
是先前结果的第一个键而不是最后一个键,则这是可复制的,这将是第一个问题

无论如何,假设
startkey
正确,参数
skip
startkey
是冲突的。最初
skip
应为0,之后应为1,以便在连续查询中跳过
startkey

CouchDB分页文档1清楚地概述了这项技术

详细信息

假设完整视图(其中键是unix时间戳)为

给定初始查询条件

{
    limit: 5,
    descending: true,
    include_docs: false // for brevity
}
确实会生成预期的结果,5行中包含最新的第一行

{
  "total_rows":7,
  "offset":0,
  "rows":[
    {"id":"821985c5140ca583e108653fb60949f3","key":1580050872339,"value":null},
    {"id":"821985c5140ca583e108653fb60945f4","key":1580050872336,"value":null},
    {"id":"821985c5140ca583e108653fb6094463","key":1580050872335,"value":null},
    {"id":"821985c5140ca583e108653fb6094309","key":1580050872334,"value":null},
    {"id":"821985c5140ca583e108653fb6093f47","key":1580050872333,"value":null}
  ]
}
现在假设第二个查询是这样的

{
    limit: 5,
    descending: true,
    include_docs: false, // for brevity
    startkey: 1580050872333,
    skip: 5
}
startkey
(先前结果最后一行的键)是正确的,但是
skip
参数实际上跳过了下一组(逻辑)行。特别是使用这些参数和上面的示例视图,查询将跳过剩余的键,从而生成一个空行集

这就是我们想要的:

{
    limit: 5,
    descending: true,
    include_docs: false, // for brevity
    startkey: 1580050872333,
    skip: 1 // just skip the last doc (startkey)
}


1使用startkey或skip的CouchDB分页方法

,返回的结果也包括一些跳过的结果,或者所有以前的结果(奇怪地混淆)

我通过使用-second部分扩展结果键解决了这个问题。 由于密钥是基于一个没有时间的日期,它似乎已经根据相似的日期时间戳重新排列了每个请求上的条目。添加第二个也可排序的部分(使用创建的时间戳作为第二部分)修复了它。
密钥现在是[datetimestamp,createdtimestamp]。。两者都可以按降序排列。

感谢您的努力。由于具有相似的键,这两种筛选都不起作用。抓取部分结果集时,结果变得不可预测。似乎在我的具体案例中引发了一个bug。
{
    limit: 5,
    descending: true,
    include_docs: false, // for brevity
    startkey: 1580050872333,
    skip: 1 // just skip the last doc (startkey)
}