错误的使用mongodb的mapReduce

使用mapReduce进行聚合,使用不当遇到的问题,本来一开始我是如下方式:

map = function(){
    emit({
        product_id : this.product_id,
        store_id : this.store_id
    },{
        quantity : this.quantity,
        id : this._id
    })
}

reduce = function(key, values){
    var results = { quantity : 0, ids : []}
    values.forEach(function(val){
        results.quantity += val.quantity
        results.ids.push(val.id)
    })
}

db.transfers.mapReduce(map, reduce, {out: {inline : 1}})

问题来了,一个key的reduce返回结果ids与实际相差不符合! 后来经过一翻折腾
把代码改如下:

map = function(){
    emit({
        product_id : this.product_id,
        store_id : this.store_id
    },{
        quantity : this.quantity,
        ids : [this._id]
    })
}

reduce = function(key, values){
    var results = { quantity : 0, ids : []}
    values.forEach(function(val){
        results.quantity += val.quantity
        results.ids.concat(val.id)
    })
}

db.transfers.mapReduce(map, reduce, {out: {inline : 1}})

原因是mapReduce执行的时候不是一个key一次聚合完,而是分段聚合!

Comments

Copyright © 2017 kaka