我想在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()