2011-09-18 97 views
5

我想在MongoDB中執行此SQL語句選擇不同的多個領域:使用MongoDB的映射減少

SELECT DISTINCT book,author from library 

到目前爲止,MongoDB的DISTINCT只支持一個場在一個時間。對於多個字段,我們必須使用GROUP命令或map-reduce。

我用Google搜索的方式來使用GROUP命令:

db.library.group({ 
    key: {book:1, author:1}, 
    reduce: function(obj, prev) { if (!obj.hasOwnProperty("key")) { 
     prev.book = obj.book; 
     prev.author = obj.author; 
    }}, 
    initial: { } 
}); 

但是這種方法只支持多達10000項。任何人都知道如何使用map reduce來解決這個問題?

回答

4

看看這個article,它解釋瞭如何在MongoDB中使用map-reduce來查找獨特的文章。

你emit語句是要看起來像:

emit({book: this.book, author: this.author}, {exists: 1}); 

和你的減少,因爲你不關心有多少是每個分組可以比的例子更簡單。

return {exists: 1}; 
+0

非常感謝。它運作良好。但是我仍然很難找到'{exists:1}'的功能。根據我的理解,這是每種獨特價值的標識符。但我仍然覺得很奇怪。 –

+1

通常情況下,這個值比較複雜,有幾個字段。你可以簡化它只發出一個值1,但是「{存在:1}」更加自我解釋,並且在你希望稍後添加更多字段時會更容易。 –

3

萬一有人面臨類似的問題。這是一個完整的解決方案:

地圖步

map= "function(){ 
    emit(
      {book: this.book, author:this.author}, {exists: 1} 
     ); 
    }" 

減少一步

reduce= "function(key, value){ 
      return {exists: 1}; 
    }" 

運行以下命令:

result= db.runCommand({ 
     "mapreduce": "library", 
     "map": map, 
     "reduce": reduce, 
     "out: "result" 
    }) 

獲得結果

db.result.find()