2015-04-01 40 views
2

我在pouchdb中创建了一个名为session_indexes/by_lastModifiedDate_status的索引,以发出时间戳以及表示状态的字符串。有关PouchDB的复杂startkey/endkey查询不返回预期结果

下面是当映射函数与数据库中的6个文件运行得到发出的数组键:

[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

由于CouchDB整理顺序,它可以这样工作。例如。对于数字+字母,你必须:

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

+0

嗨诺兰:)换句话说 - 如何做我真正创建我想创建查询?我想我明白了startkey/endkey现在是如何工作的。我之前没有,但现在我明白整个关键阵列实际上是平坦的和一维的。所以如果startkey是'[1,A]'而endkey是'[2,A]',那么它也会选择'[1,B]',这与WHERE子句中的SQL过滤相反。我知道它现在不是where子句:)但是我仍然失去了如何创建我想创建的查询,除非我不创建二级索引。我使用JavaScript过滤吗? – Katie 2015-04-02 13:23:40

+0

您可以反转订单,然后执行两个单独的查询。 :) – nlawson 2015-04-03 00:32:24