2012-09-27 76 views
0

我有書和作者collection.in這個名字和works_written是分別相同的值列。所以我試了下面的腳本,但它只發出第一個地圖值,第二個地圖值不發射。mongo需要使用標識列加入兩個集合,並從兩個集合中發出需要的列

book = function() { 
emit(this.id, {name: this.name,editions:this.editions}); 
} 
author = function() { 
emit(this.id, {name:this.name,works_written: this.works_writtten,}); 
} 


r_b = function(k, values) { 
var result = {}; 
values.forEach(function(value) { 
    var name; 
    for (name in value) { 
     if (value.hasOwnProperty(name)) { 
      result[name] = value[name]; 
     } 
    } 
}); 
return result; 
}; 
r_a = function(k, values) { 
var result = {}; 
values.forEach(function(value) { 
    var works_written; 
    for (works_written in value) { 
     if (value.hasOwnProperty(works_written)) { 
      result[works_written] = value[works_written]; 
     } 
    } 
}); 
return result; 
}; 
    res = db.book.mapReduce(book, r_ja, {out: {reduce: 'joined'}}) 
    res = db.author.mapReduce(author, r_jp, {out: {reduce: 'joined'}}) 

有人可以幫我嗎?

+0

加入works.but我逗號分隔值在works_written.how我可以這樣做。 – Rudra

+0

我用來計算的分割函數是:map = function(){ if(this.works_written!= null) { var array = this.works_written.split(','); emit(this.works_written,array.length);} } reduce = function(key,values){ return values [0]; } 結果= db.runCommand({ 「MapReduce的」: 「作者」, 「地圖」:映射, 「減少」:減少, 「出」: 「split_result」 }); – Rudra

回答

0

從看你的代碼,看起來你有兩個集合,「書」和「作者」。每本書的結構爲

{ 
    id: <some id>, 
    name: <some name>, 
    editions: <comma-separated string of editions> 
} 

和每個作者的結構爲

{ 
    id: <some id>, 
    name: <some name>, 
    works_written: <comma-separated string of works written> 
} 

這將是更合理的同時存儲works_written和版本的陣列,而不是逗號分隔列出每個包裝成一個單獨的字符串。這將使得遍歷數組成爲可能。

此外,你是否有每個作者和每本書的多個文件?如果不是,你不需要mapreduce去做你正在嘗試做的事 - 一個簡單的find()應該可以工作。

如果我誤解了,你究竟想要做什麼?

+0

請把這張貼爲完整script.no需要在editions.only中做任何事情,以comapare名字[書籍]和work_written(作者)[csv數據]在作者的書籍和名稱欄中發佈名稱和版本列。 。 – Rudra