當然!我最喜歡的一個觀點是,它的力量是by_field
。這是一個非常簡單的地圖功能。
function(doc) {
// by_field: map function
// A single view for every field in every document!
var field, key;
for (field in doc) {
key = [field, doc[field]];
emit(key, 1);
}
}
假設您的文件有.name
場爲他們的名字,併爲.email
他們的電子郵件地址。
按名稱獲取用戶(例如 「愛麗絲」 和 「鮑勃」。):
GET /db/_design/example/_view/by_field?include_docs=true&key=["name","Alice"]
GET /db/_design/example/_view/by_field?include_docs=true&key=["name","Bob"]
通過電子郵件獲得的用戶,從同樣的觀點:
GET /db/_design/example/_view/by_field?include_docs=true&key=["email","[email protected]"]
GET /db/_design/example/_view/by_field?include_docs=true&key=["name","[email protected]"]
我喜歡它的原因發出1
就是這樣您可以稍後編寫reduce函數,以便使用sum()
輕鬆地合併與您的查詢匹配的文檔。
這就是我如何解決這個問題,但我擔心的是可擴展性。對於每個具有m個字段的n個文檔,它將輸出大約n * m行。我不熟悉CouchDB的內部,但作爲一個MySQL的傢伙,我不知道這是否會花費很長時間。 –
最初調用視圖可能需要一些時間,但視圖結果被緩存,因此只有在更新查詢視圖時才考慮更新的文檔。 – grefab
另外,如果你不需要每個字段輸出,你可以修改上面的「by_field」MapReduce,只輸出你感興趣的字段(在你的計劃中)。在你的n * m等式中,m是數字你關心的領域。也就是說,讓它「廣泛開放」確實會給你更多的靈活性,但是視圖索引使用的磁盤空間(儘管相對較少)會有更多的磁盤空間(gre提到的結果緩存)。 – BigBlueHat