mongodb group by string of length

时间:2014-07-28 15:40:52

标签: javascript mongodb mapreduce mongodb-query

你能帮我把这个SQL查询转换成MongoDB吗?

SELECT CHAR_LENGTH(field), count(distinct field2), count(*) 
FROM table GROUP BY  CHAR_LENGTH(field)

提前致谢!

2 个答案:

答案 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。