2014-02-25 36 views
1

我在想我應該是一個簡單的地圖減少,但我有麻煩,因爲我找不到如何編寫服務器端JavaScript的參考。MongoDB Map-Reduce將文檔與動態模式結合起來

假設有兩個文件:

{ 
    "_id" : ObjectId("530c8b58d95cd926144055d9"), 
    "atomic" : "p", 
    "doc" : { 
    "d1" : "t" 
    }, 
    "array" : ["e"] 
}, 
{ 
    "_id" : ObjectId("530c8b71d95cd926144055da"), 
    "atomic" : "p", 
    "doc" : { 
    "d2" : "r" 
    }, 
    "array" : ["f"] 
} 

我想的結果是

{ 
    "_id" : "p", 
    "value" : { 
    "doc" : { 
     "d1" : "t", 
     "d2" : "r" 
    }, 
    "array" : ["e", "f"] 
    } 
} 

地圖功能是:

function() { 
    emit(
     this.atomic,      
     {doc: this.doc, array: this.array} 
    ); 
} 

不正確減少功能是:

function (key, values) { 
var reduced = {doc:{}, array:[]}; 
values.forEach(function(val){ 
    for(var i = 0; i < val.array.length; i++) 
     reduced.array.push(val.array[i]); 
    val.doc.forEach(function(kvp){reduced.doc.add(kvp.key, kvp.value);}); 
}); 
return reduced; 
} 

該數組的部分是好的,它試圖結合混亂的文件(即由於缺少功能而沒有執行)。我嘗試了所有我能想到的排列方式 - 如果將val.doc添加到數組中,那麼它們都會顯示出來,這只是我無法弄清楚如何將它合併到單個文檔中。

文檔中的字段將是動態的,因此無法通過名稱引用它。

任何幫助,將不勝感激。

回答

1

不確定reduced.doc.add位是否有效。

也許嘗試:

function (key, values) { 
var reduced = {doc:{}, array:[]}; 
values.forEach(function(val){ 
    for(var i = 0; i < val.array.length; i++) 
     reduced.array.push(val.array[i]); 
    for (kvp in val.doc){ 
     reduced.doc[kvp]=val.doc[kvp]; 
    } 
}); 
return reduced; 
} 
+1

咄,有一件事我沒有嘗試。謝謝! – mikkelfishman

相關問題