2013-08-23 31 views
5

我讀過一些示例代碼(特別是從Couchbase Model Views演示項目link),並意識到map()函數太奇怪了。爲什麼發射(meta.id,NULL)

function(doc, meta) { 
    if (doc.type == "beer" && doc.name){ 
     emit(doc.name, null); 
    } 
} 

爲什麼EMIT函數的值是零,但是從GetView結果(「啤酒」,「啤酒」)是完全獲得價值???

請幫我一把!

+0

其實是因爲javascript的本質,你可以調用只發射(doc.name) – avsej

回答

7

在couchbase通常視圖的結果集是在後臺構建的。如果你有例如100萬個文件,每個4Kb大小沒有任何視圖,它需要〜4Gb的磁盤。當你創建了

function(doc, meta) { 
    emit(doc.name, doc); 
} 

地圖功能的視圖因此,它需要額外的4Gb磁盤上的觀點的結果,因爲查看結果分開存儲。在大多數情況下(如果使用參數Stale=Ok查詢視圖),couchbase將返回該「預編譯」記錄集的結果,但couchbase不會掃描每個查詢中的所有文檔。

因此,在映射函數中使用null可用於防止磁盤空間使用,並且還會提高索引進程的速度。

現在,第二個關於couchbase魔法的問題是:「來自GetView(」啤酒「,」啤酒「)的結果是獲得完美的價值。 Couchbase get(key)getMulti(keys)的操作速度非常快。因此,當您查詢發出null的視圖時,它不僅會返回nulls,還會返回文檔ID。然後,您可以手動使用getMulti來獲取文檔ID的數組以獲取文檔的值,或者在某些SDK中,存在稱爲IncludeDocs的查詢參數,該參數將自動執行相同操作。