2011-09-18 71 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()