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



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

SELECT DISTINCT book,author from library

到目前为止,MongoDB的DISTINCT一次只支持一个字段。对于多个字段,我们必须使用GROUP命令或map-reduce。

我搜索了一种使用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来解决这个问题吗?

看一看这篇文章,它解释了如何在MongoDB中使用map-reduce找到唯一的文章。

你的emit语句看起来像这样:

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

和您的reduce甚至可以比示例更简单,因为您不关心每个分组有多少。

return {exists: 1};

以防有人遇到类似的问题。这是完整的解决方案:

映射步骤

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()

相关内容

  • 没有找到相关文章