Javascript 计算订单总数的mongodb mapreduce脚本失败
我是mongodb的新手,我计划从SQL迁移到noSQL。我有很多存储过程,我认为mapReduce是noSQL世界中的“等价物”。 我从一个js脚本开始,它试图按客户统计订单,但它给出了错误的结果。 剧本是:Javascript 计算订单总数的mongodb mapreduce脚本失败,javascript,mongodb,Javascript,Mongodb,我是mongodb的新手,我计划从SQL迁移到noSQL。我有很多存储过程,我认为mapReduce是noSQL世界中的“等价物”。 我从一个js脚本开始,它试图按客户统计订单,但它给出了错误的结果。 剧本是: db = connect("localhost:27017/pgi"); for(i=0;i<1000;i++){ db.orders.insert( { "cust_id" : 1, "tota
db = connect("localhost:27017/pgi");
for(i=0;i<1000;i++){
db.orders.insert(
{
"cust_id" : 1,
"total" : 100,
});
}
for(i=0;i<1000;i++){
db.orders.insert(
{
"cust_id" : 2,
"total" : 100,
});
}
var res = db.orders.find({cust_id : 1});
print("Total Orders for customer 1:" + res.count());
var res = db.orders.find({cust_id : 2});
print("Total Orders for customer 2:" + res.count());
//map reduce
var map = function(){
emit(this.cust_id, 1);
}
var reduce = function(key, values){
var c = 0;
for (index in values) {
c += 1;
}
return {cust_id : key, count: c};
}
var res = db.orders.mapReduce(
map,
reduce,
{
out : {inline : 1}
}
);
res.find({}).forEach(function(item){
printjson(item);
});
有人能告诉我出了什么事吗。
关于,使用MapReduce,reducer输出的格式必须与mapper输出值的格式相同,因为reducer可能会为同一个键运行多次。此外,reducer不需要输出键,只需要在输入数组上执行所需的任何操作后输出结果值 因此,在您的例子中,映射器按客户计数订单看起来是正确的,但是reducer应该只输出总计数,而不是生成具有键和计数的对象 此外,reducer需要对每个
索引的值求和,而不是递增1,以处理它在reduce函数先前调用的输出上运行的情况
var reduce = function(key, values){
var c = 0;
for (var index in values) {
c += values[index];
}
return c;
}
Map/reduce不是存储过程的等价物。对于这个简单的作业,使用equiv要简单得多。这就是为什么我在引号之间加上equiv。我认为从长远来看,我必须使用聚合,因为我的需求比简单的元素计数要复杂得多。
var reduce = function(key, values){
var c = 0;
for (var index in values) {
c += values[index];
}
return c;
}