我在這裏看到的(如果需要,我會改變我的答案)key1
和key2
看起來像獨立的字段,所以你需要2個獨立的視圖。
我創建了我的測試數據庫5個簡單的文件:
// I've left out fields like _id and _rev for the sake of simplicity
{ "key1": "somevalue" }
{ "key1": "somevalue" }
{ "key2": "anotherval" }
{ "key2": "andanother" }
{ "key2": "andanother" }
這裏有2次視圖的查詢您需要:
// view for key1
function(doc) {
if (doc.key1) {
emit("key1", doc.key1);
}
}
// view for key2
function(doc) {
if (doc.key2) {
emit("key2", doc.key2);
}
}
從那裏,你減少函數可以返回所有的值通過這樣做:
function (key, values) {
return values;
}
但是,您特別提到了不同值。由於JavaScript沒有用於數組的原生unique()
方法,並且我們不能在視圖函數中使用CommonJS模塊,所以我們必須添加自己的邏輯。我只是複製了我在Google上發現的第一個array.unique()
函數,您可以自己編寫一個更好的優化版本。
function (key, values, rereduce) {
var o = {}, i, l = values.length, r = [];
for (i = 0; i < l; i += 1) {
o[values[i]] = values[i];
}
for (i in o) {
r.push(o[i]);
}
return r;
}
您將在這兩個視圖中使用相同的reduce函數。當你查詢任何這些視圖時,默認情況下它也會執行reduce。 (你需要明確地傳遞reduce=false
讓你map
功能的只是結果
這裏有你檢索使用上述map/reduce
查詢結果集:(記得他們是2次獨立的查詢)
{"rows":[
{"key":"key1", "value": ["somevalue"]}
]}
{"rows":[
{"key": "key2", "value": ["anotherval", "andanother"]}
]}
您可以加入關於你的文檔結構的更多細節? 'key1'和'key2'完全不同的字段?他們有某種相關性嗎? – 2011-03-28 14:21:24
@Dominic - 我認爲它的意思是{「key」:「key1」,「value」:「somevalue」}和{「key」:「key2」,「value」:「othervalue」}而不是key1和key2是不同的領域,但我同意它是模糊的。 – 2011-03-30 15:55:49
@Matt這或多或少是正確的,我們已經嘗試了非常類似的解決方案,但不得不應對「reduce_overflow_error」問題。 – wayoutmind 2011-04-01 11:54:20