Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用mapReduce在mongodb中检索总和和计数_Javascript_Mongodb_Mapreduce_Mongodb Query_Aggregation Framework - Fatal编程技术网

Javascript 使用mapReduce在mongodb中检索总和和计数

Javascript 使用mapReduce在mongodb中检索总和和计数,javascript,mongodb,mapreduce,mongodb-query,aggregation-framework,Javascript,Mongodb,Mapreduce,Mongodb Query,Aggregation Framework,如何使用mapReduce将以下SQL查询转换为mongoDB SELECT mobile, SUM( amount ),count(mobile) as noOfTimesRecharges FROM recharge WHERE recharge_date between '2015-02-26' AND '2015-03-27' GROUP BY mobile having noOfTimesRecharges > 0 and noOfTimesRecharges <

如何使用mapReduce将以下SQL查询转换为mongoDB

SELECT mobile, SUM( amount ),count(mobile) as noOfTimesRecharges
FROM recharge
WHERE recharge_date  between  '2015-02-26' AND  '2015-03-27'
GROUP BY mobile
having noOfTimesRecharges > 0 and  noOfTimesRecharges < 5

这给了我结果,但不是计数。

所以在这种情况下,您可能真的需要。它在本机代码操作中运行,并且比通过对的JavaScript求值可以实现的速度快得多

db.users.aggregate([
{“$match”:{
“充值日期”:{
“$gte”:ISODate(“2014-06-17”),
“$lte”:ISODate(“2014-06-20”)
}
}},
{“$组”:{
“_id”:“$mobile”,
“金额”:{“$sum”:“$amount”},
“计数”:{“$sum”:1}
}},
{“$match”:{
“计数”:{“$gt”:1,“lt”:5}
}}
{“$out”:“newCollection”}
],
{“allowDiskUse”:true}
)
它的效率更高,编码也更简单

还可以查看常见示例

如果您确实需要mapReduce(您可能不需要),那么正确的方法是:

db.users.mapReduce(
函数(){
emit(this.mobile,{“amount”:this.amount,“count”:1});
},
功能(键、值){
var doc={“金额”:0,“计数”:0};
values.forEach(函数(值){
单据金额+=value.amount;
doc.count+=value.count;
};
退货单;
},
{ 
“out”:{“replace”:“newCollection”},
“查询”:{
“充值日期”:{
“$gte”:ISODate(“2014-06-17”),
“$lte”:ISODate(“2014-06-20”)
}
}
}
)

但是,在“限制”结果方面,您不会得到与聚合管道相同的情况,而无需对结果集合进行额外处理。

因此,在这种情况下,您可能真的希望得到结果。它在本机代码操作中运行,比通过对的JavaScript求值实现的速度快得多

db.users.aggregate([
{“$match”:{
“充值日期”:{
“$gte”:ISODate(“2014-06-17”),
“$lte”:ISODate(“2014-06-20”)
}
}},
{“$组”:{
“_id”:“$mobile”,
“金额”:{“$sum”:“$amount”},
“计数”:{“$sum”:1}
}},
{“$match”:{
“计数”:{“$gt”:1,“lt”:5}
}}
{“$out”:“newCollection”}
],
{“allowDiskUse”:true}
)
它的效率更高,编码也更简单

还可以查看常见示例

如果您确实需要mapReduce(您可能不需要),那么正确的方法是:

db.users.mapReduce(
函数(){
emit(this.mobile,{“amount”:this.amount,“count”:1});
},
功能(键、值){
var doc={“金额”:0,“计数”:0};
values.forEach(函数(值){
单据金额+=value.amount;
doc.count+=value.count;
};
退货单;
},
{ 
“out”:{“replace”:“newCollection”},
“查询”:{
“充值日期”:{
“$gte”:ISODate(“2014-06-17”),
“$lte”:ISODate(“2014-06-20”)
}
}
}
)

但在“限制”方面,你不会遇到同样的情况您可以使用聚合管道生成结果,而无需对结果集合进行额外处理。

我有大约1000万条使用聚合的记录,内存错误为16MBlimit@Vibhas这就是为什么您使用
allowDiskUse
作为param@Vibhas这就是为什么如果其他方法同样失败。是的,你们是对的,但我怎样才能添加having子句来限制组的结果呢by@Vibhas你说的是NoSQL世界中的SQL,这看起来不太好。解释一下你的意思。顺便说一句,你的原始问题中没有哪个,因为我已经回答了。我有大约1000万条使用聚合的记录,给了我16MB lim的内存错误it@Vibhas这就是为什么您使用
allowDiskUse
作为param@Vibhas这就是为什么在其他方法也失败的情况下,有一种mapReduce方法可以做到这一点。是的,您是对的,但我如何添加having子句来限制组的结果呢by@Vibhas你说的是NoSQL世界中的SQL,看起来不太好。解释一下你的意思。Whi顺便说一句,你原来的问题不在这里,因为我已经回答了。
db.users.mapReduce(
function(){
emit(this.mobile,this.amount);
},
function(k,v){
return Array.sum(v)
},
{
query:{
recharge_date:{$gte:ISODate("2014-06-17"),$lte:ISODate("2014-06-20")}
},
out:"one_month_data" 
}).find();