Javascript 按字符串长度划分的mongodb组

Javascript 按字符串长度划分的mongodb组,javascript,mongodb,mapreduce,mongodb-query,Javascript,Mongodb,Mapreduce,Mongodb Query,你能帮我把这个SQL查询转换成MongoDB吗 SELECT CHAR_LENGTH(field), count(distinct field2), count(*) FROM table GROUP BY CHAR_LENGTH(field) 提前谢谢 还没有:,所以尽管MongoDB知道长度,但目前它实际上无法给出它的长度 目前最好的方法是将strlen作为一个整数保存在另一个字段中,然后在该字段上分组。还没有:,因此,即使MongoDB知道长度,但它目前实际上无法给出它 当前最好的方

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

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

还没有:,所以尽管MongoDB知道长度,但目前它实际上无法给出它的长度

目前最好的方法是将strlen作为一个整数保存在另一个字段中,然后在该字段上分组。

还没有:,因此,即使MongoDB知道长度,但它目前实际上无法给出它

当前最好的方法是将strlen作为整数保存在另一个字段中,然后在该字段上分组。

是当前的方法,因为目前没有其他方法来计算字符串的长度,您需要JavaScript计算函数来完成此操作:

db.collection.mapReduce(
函数(){
emit(this.field.length,{“field2”:[this.field2],“count”:1});
},
功能(键、值){
var reduced={“field2”:[],“count”:0};
values.forEach(函数(值){
value.field2.forEach(函数(field2){
if(减少的字段2.indexOf(字段2)=-1)
减少。字段2。推送(字段2);
});
reduced.count+=value.count;
});
回报减少;
},
{
“最终确定”:功能(键、值){
var输出={“field2count”:0,“count”:value.count};
value.field2.forEach(函数(field2){
output.field2count+=1
});
返回输出;
},
“out”:{“inline”:1}
}
)
因此,由于标准JavaScript函数可用,您可以在“字段”中获取字符串的长度,并将其作为分组键发出

为了获得其他“field2”上的“distinct”计数以及该分组中的总计数,“value”部分在“map”和“reduce”函数中的处理方式非常重要

这是人们在使用mapReduce时经常忽略的部分,因为“reducer”实际上可以多次调用。因此,例如,如果您发射100个或更多具有相同值的“键”,则“减速机”不一定一次处理所有键。它可能只调用其中的一些,应用reduce函数,然后将从“reduce”返回的文档“重新排队”,以便针对相同值的其他“键”或之前已“reduce”的其他“键”进行进一步迭代

这就是处理大数据的方式,reducer将继续这样做,直到同一个键只有一个值。这就是为什么“映射器”和“还原器”中发出的“值”的“签名”必须相同的原因

除了“累加”出现的“字符串长度”键外,“映射器”还通过检查数组中是否已经存在该值,将“field2”数组缩减为唯一的值

这就是“finalize”函数的作用。当文档减少后,“field2”值(当前为数组)将转换为其“lenght”,从而返回“distinct count”

这里有一个“length”函数可供聚合框架使用,这将是一个“不错”的选择,但由于目前没有该函数,因此这是使用mapReduce的地方。

是当前的方法,因为目前没有其他方法来计算字符串的长度,因此需要JavaScript计算函数:

db.collection.mapReduce(
函数(){
emit(this.field.length,{“field2”:[this.field2],“count”:1});
},
功能(键、值){
var reduced={“field2”:[],“count”:0};
values.forEach(函数(值){
value.field2.forEach(函数(field2){
if(减少的字段2.indexOf(字段2)=-1)
减少。字段2。推送(字段2);
});
reduced.count+=value.count;
});
回报减少;
},
{
“最终确定”:功能(键、值){
var输出={“field2count”:0,“count”:value.count};
value.field2.forEach(函数(field2){
output.field2count+=1
});
返回输出;
},
“out”:{“inline”:1}
}
)
因此,由于标准JavaScript函数可用,您可以在“字段”中获取字符串的长度,并将其作为分组键发出

为了获得其他“field2”上的“distinct”计数以及该分组中的总计数,“value”部分在“map”和“reduce”函数中的处理方式非常重要

这是人们在使用mapReduce时经常忽略的部分,因为“reducer”实际上可以多次调用。因此,例如,如果您发射100个或更多具有相同值的“键”,则“减速机”不一定一次处理所有键。它可能只调用其中的一些,应用reduce函数,然后将从“reduce”返回的文档“重新排队”,以便针对相同值的其他“键”或之前已“reduce”的其他“键”进行进一步迭代

这就是处理大数据的方式,reducer将继续这样做,直到同一个键只有一个值。这就是为什么“映射器”和“还原器”中发出的“值”的“签名”必须相同的原因

除了“累加”出现的“字符串长度”键外,“映射器”还通过检查数组中是否已经存在该值,将“field2”数组缩减为唯一的值

这就是“finalize”函数的作用。当文档减少后,“field2”值(当前为数组)将转换为其“lenght”,从而返回“distinct count”

这里有一个可用于聚合框架的“length”函数是“不错”的,但由于目前没有,所以这里就是使用mapReduce的地方