2015-03-02 79 views
1

我試圖構建一個篩選器視圖,我可以根據列範圍篩選文檔。我的地圖功能看起來像這樣:從Couchbase的查看查詢結果返回完整文檔

function (doc, meta) { 
    if(!doc.tombstone) { 
    emit([doc.effectiveDateTime]); 
    } 
} 

當我從代碼查詢此視圖時,結果只有鍵而不是文檔。

我可以想出以下方法來解決這個問題,並需要幫助決定哪一個可以工作。

  1. setIncludeDocs:探索文檔一點點,我就翻過這java code snippet其中setIncludeDocs方法被調用的查詢返回的完整資料與結果。 它看起來很有希望,不幸的是我無法在C#SDK中找到這種方法的等價物。

  2. 查詢各個文檔:發射所述文檔ID作爲像emit([doc.effectiveDateTime], meta.id);值和從客戶端分別查詢每個文檔。我不想使用這種方法,因爲客戶端最終會對服務器進行多次調用以獲得完整的結果集,並會導致客戶端的性能問題。

  3. 發出整個文檔:我可以發射整個文檔作爲映射器的emit語句中的值,如下所示:emit([doc.effectiveDateTime], doc);。這種方法的優點是客戶端只需進行一次調用即可獲得結果集。但我不確定這對索引規模的影響。鑑於我的映射器將在大多數文檔上工作,索引尺寸將增長或者couchbase能夠以某種方式在內部對其進行優化?內精簡函數(不知道這是可行的)

  4. 查詢文件:如果我修改映射器發出的文件ID作爲值,並有一個機制來查詢,並從機內部得到整個文檔,然後我應該能夠在減速器內部形成結果集。 有沒有可用於從reducer內部訪問數據庫的javascript apis?

任何有關上述要點或任何新的建議將不勝感激。

+0

您正在使用哪種版本的C#SDK? – 2015-03-02 17:39:58

+0

關於3. *是*指數肯定會增長。 couchbase應自動包括文檔的ID作爲視圖結果元數據的一部分雖然,所以2.應當至少部分地支撐在各個SDK版本...例如爪哇2.0 SDK有一個方法'getDocument'在內部使用該元數據,併發出鑰匙上的'get'... – 2015-03-02 17:42:43

+1

好問題,CB確實有一個C#庫中的多項目以及一個內置的c#方法來獲取視圖結果迭代中當前項目的完整文檔。我今晚有空時會發布完整答案。 – theMayer 2015-03-02 20:47:29

回答

1

在C#SDK 2.x中,最好的辦法是選擇2與一捻:查詢引擎已發出文件的ID作爲其響應的元數據的一部分,沒有必要爲您的觀點發出了。使用IViewResultRows方法遍歷行。這給你一個ViewRow<T>的每一行。在ViewRow上,只需獲取Id屬性。然後你可以用通常的方式get關聯文件。

+0

只是好奇,最好是讓他們單獨或與批量獲取? – Kirk 2015-03-03 15:42:38

+0

批量獲得肯定會給你更好的表現,但兩者都可以 – 2015-03-03 17:06:02

+0

我知道這兩個都沒問題,但批量獲得更好的表現嗎? – Kirk 2015-03-04 17:33:13