2015-04-01 77 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