你能帮我把这个SQL查询转换成MongoDB吗?
SELECT CHAR_LENGTH(field), count(distinct field2), count(*)
FROM table GROUP BY CHAR_LENGTH(field)
提前致谢!
答案 0 :(得分:2)
还没有:https://jira.mongodb.org/browse/SERVER-5319,所以即使MongoDB知道它的长度,它现在也无法实现。
目前最好的方法是将strlen保留在另一个字段中作为整数然后分组。
答案 1 :(得分:2)
MapReduce是当前的方法,因为没有其他现有方法来评估字符串的长度,您需要JavaScript评估函数来执行此操作:
db.collection.mapReduce(
function() {
emit( this.field.length, { "field2": [this.field2], "count": 1 } );
},
function(key,values) {
var reduced = { "field2": [], "count": 0 };
values.forEach(function(value) {
value.field2.forEach(function(field2) {
if ( reduced.field2.indexOf(field2) == -1 )
reduced.field2.push(field2);
});
reduced.count += value.count;
});
return reduced;
},
{
"finalize": function(key,value) {
var output = { "field2count": 0, "count": value.count };
value.field2.forEach(function(field2) {
output.field2count += 1
});
return output;
},
"out": { "inline": 1 }
}
)
因为标准JavaScript函数可用,所以你可以在"字段"中获得字符串的长度。并将其作为分组键发出。
为了获得" distinct"依靠另一个" field2"以及此分组中的总计数,"值"部分在" map"并且"减少"功能很重要。
这是人们经常会错过mapReduce的部分,作为" reducer"实际上可以被多次调用。因此,例如,如果您要发出100个或更多"键"具有相同的值,然后" reducer"并不一定一次处理它们。它可能只调用其中一些,应用reduce函数,然后"重新排队"返回来自" reduce"进一步反复其他"键"相同价值或其他"键"以前已经减少"。
这是处理大数据的方式,reducer将继续执行此操作,直到同一个键只有一个值存在。这就是"签名" "值"在"映射器和#34;中发射的需要相同。和#34; reducer"。
除了"加起来" "字符串长度"的出现关键,"映射器"减少" field2"通过检查数组中是否已存在该值,将数组转换为不同的值。
这是"最终确定"功能进来。一旦文件减少," field2" value(当前是一个数组)被转换为它" lenght",从而返回" distinct count"。
这将是"很好"有一个"长度"此处聚合框架可用的功能,但由于目前还没有这个功能,因此您可以使用mapReduce。