使用MongoDB的map reduce选择不同的多个字段

时间:2011-09-18 10:27:03

标签: mongodb mapreduce

我想在MongoDB上执行这个SQL语句:

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: { } 
});  

但是这种方法最多只支持10,000个密钥。有谁知道如何使用map reduce来解决这个问题?

2 个答案:

答案 0 :(得分:4)

看看这个article,它解释了如何在MongoDB中使用map-reduce查找独特的文章。

你的emit语句看起来像:

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

并且你的缩小甚至比示例更简单,因为你不关心每个分组的数量。

return {exists: 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()