Javascript 计算订单总数的mongodb mapreduce脚本失败

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

我是mongodb的新手,我计划从SQL迁移到noSQL。我有很多存储过程,我认为mapReduce是noSQL世界中的“等价物”。 我从一个js脚本开始,它试图按客户统计订单,但它给出了错误的结果。 剧本是:

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;
}