我想在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来解决这个问题?
答案 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()