关于PouchDB的复杂startkey / endkey查询未返回预期结果

时间:2015-04-01 17:53:39

标签: javascript couchdb pouchdb

我在pouchdb中创建了一个名为session_indexes/by_lastModifiedDate_status的索引,以发出时间戳和字符串,表示状态。

以下是在数据库中使用6个文档运行map函数时发出的数组键:

[1404446400000, 'SUSPENDED']
[1409630400000, 'OPEN']
[1413777600000, 'OPEN']
[1423976400000, 'CLOSED']
[1425704400000, 'OPEN']
[1430193600000, 'OPEN']

现在,我想使用startkeyendkey查询此索引。我通过提供以下内容来实现:

startkey: [1422766800000, 'CLOSED']
endkey: [1427688000000, 'CLOSED']

这意味着我想查找具有这两个时间戳之间的日期且状态为CLOSED的所有文档。

然而,PouchDB似乎只返回与日期匹配的结果 - 所以它返回2个结果(另一个是[1425704400000, 'OPEN'])。

我使用的地图功能如下。我知道它看起来很奇怪 - 但这实际上是由代码生成的。它不是由人写的。但它仍然可以正常发出正确的键:

function(document) {
  if(document._id.startsWith('session')) {
    var keys = [];

    if(document.lastModifiedDate) {
      keys.push(document.lastModifiedDate);
    }

    if(document.status) {
      keys.push(document.status.text.toUpperCase());
    }

    emit(keys, null);
  }
}

查询本身如下:

return Database.instance().query('session_indexes/by_lastModifiedDate_status', {
    startkey: [1422766800000, 'CLOSED'],
    endkey: [1427688000000, 'CLOSED'],
    include_docs: true
}).then(function(result) {
    return _(result.rows).map(function(row) {
        return Session.fromDocument(row.doc, new Session());
    });
});

编辑:如果我颠倒了订单并将状态放在第一位,那么查询似乎可以按预期工作。我可以问为什么?我该如何解决这个问题?

我很感激你能提供给我的任何帮助。谢谢!

1 个答案:

答案 0 :(得分:1)

由于CouchDB整理排序,它的工作方式是这样的。例如。对于数字+字母,你有:

[1, A] [1, B] [2, A] [2, B]