我讀過一些示例代碼(特別是從Couchbase Model Views演示項目link),並意識到map()函數太奇怪了。爲什麼發射(meta.id,NULL)
function(doc, meta) {
if (doc.type == "beer" && doc.name){
emit(doc.name, null);
}
}
爲什麼EMIT函數的值是零,但是從GetView結果(「啤酒」,「啤酒」)是完全獲得價值???
請幫我一把!
我讀過一些示例代碼(特別是從Couchbase Model Views演示項目link),並意識到map()函數太奇怪了。爲什麼發射(meta.id,NULL)
function(doc, meta) {
if (doc.type == "beer" && doc.name){
emit(doc.name, null);
}
}
爲什麼EMIT函數的值是零,但是從GetView結果(「啤酒」,「啤酒」)是完全獲得價值???
請幫我一把!
在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
的查詢參數,該參數將自動執行相同操作。
其實是因爲javascript的本質,你可以調用只發射(doc.name) – avsej