2013-06-12 52 views
0

我是Couchbase的新手,我正在努力獲得一個複合索引來做我想做的事。用例是這樣的:在couchbase中的複合視圖

  • 我有一組「枚舉」被存儲爲文件
  • 每個人都有一個「LAST_UPDATED」字段, - 正如你可能已經猜到了 - 存儲最後一次現場進行了更新
  • 我希望能夠只顯示因爲某些給定的日期已更新的枚舉,但仍

我創建了一個Couchbase觀象枚舉的名稱排序列表這個:

function (doc, meta) { 
    var time_array; 
    if (doc.doc_type === "enum") { 
     if (doc.last_updated) { 
     time_array = doc.last_updated.split(/[- :]/); 
     } else { 
     time_array = [0,0,0,0,0,0]; 
    } 
    for(var i=0; i<time_array.length; i++) { time_array[i] = parseInt(time_array[i], 10); } 
    time_array.unshift(meta.id); 
    emit(time_array, null); 
} 

}

我有沒有LAST_UPDATED字段設置一個記錄,因此有它的時間字段都設置爲零。我認爲作爲一個第一次測試,我可以篩選出結果,我把在以下幾點:

startkey = ["a",2012,0,0,0,0,0] 
endkey = ["Z",2014,0,0,0,0,0] 

雖然列表是由「身份證」它沒有任何過濾排序!誰能告訴我我做錯了什麼?是否有更好的複合視圖來實現這些結果?

回答

1

在couchbase中,當通過startkey - endkey查詢視圖時,無法過濾2個或更多屬性的結果。 Couchbase只有一個索引,所以它只會通過第一個參數來過濾結果。所以,你的查詢將等同與查詢:

startkey = ["a"] 
endkey = ["Z"] 

這裏是一個link由菲利普MANANA完成答案,爲什麼它不能被這些日期進行過濾。

這裏是從它報價:

對於複合鍵(陣列),元件被比較由左到右和作爲元是從其他密鑰(相應元件不同的比較,一旦完成與比較字符串àla memcmp()或strcmp())時發生的情況相同。

所以,如果你想有一個按日期過濾的視圖,日期數組應該先在組合鍵。

+0

但我不明白的是,如果我不帶字符串組件,而是隻使用日期和時間的各個方面的數組元素,我可以通過使用start/end_key來過濾到數組的任何元素,它看起來也被用於排序目的。 – ken

+0

是的。 Couchbase按鍵排序結果,所以如果你有像'[doc.a,doc.b,doc.c]這樣的複雜鍵,'docs將首先按doc.a排序,那麼具有相同doc.a的值將按doc排序.b等。如果'startkey:['a','b','c']'和'endkey:['z','x','c']'couchbase查找所有隻能服務的密鑰,則同樣的行爲用於過濾第一個條件。但是如果你在開始/結束鍵中有相同的值,比如'['a','b']'和'['a','x']'couchbase將會選擇'doc.a ='a' 'doc.b ='b'..'x''。 – m03geek