Pymongo MapReduce 作为子数组元素的总和

Posted

技术标签:

【中文标题】Pymongo MapReduce 作为子数组元素的总和【英文标题】:Pymongo MapReduce as sum of subarray element 【发布时间】:2018-01-28 05:07:16 【问题描述】:

我正在尝试对这种数据集执行 MapReduce:

 
"_id": "599861ce7ce78cd973746906",
"name": "Macias Rosario",
"col": [
  
    "date": "15/03/2016",
    "name": "MAGNEATO",
    "amount": 313.86
  ,
  
    "date": "08/08/2016",
    "name": "FORTEAN",
    "amount": 151.06
  ,
  
    "date": "05/11/2014",
    "name": "ECRATIC",
    "amount": 291.68
  
]

目标是总结姓名 Macias Rosario 的所有 金额。目前我用我的代码以这种方式按子元素this.col.name 进行分组:

mapper = Code("""
                           function()    
                           for (var index = 0; index < this.col.length; ++index) 
                                var col = this.col[index];
                                emit(col.name, col.amount );
                               
                           
                           """)
        reducer = Code("""
                           function(key, values) 
                               var total =  0;
                               for( var i = 0; i < values.length; ++i)
                                    total += values[i];


                               
                               return value.price;
                           
               """)
        result = collection.map_reduce(mapper, reducer, "myresult")

有没有人知道如何参考,或按this.name 分组,而不是this.col.name,因为我不知道了,而且我快疯了? PS不建议我使用aggregate,这样做了,也想尝试这种方式:) 亲切的问候,

【问题讨论】:

【参考方案1】:

我希望下面的代码有帮助(也适用于 pymongo)

这是我的地图功能:

var mapFunction = function() 
    for (var idx = 0; idx < this.col.length; idx++) 
        var key = this.name;
        var value =  amount : this.col[idx].amount ;
        emit(key, value);
    
;

以下是我的reduce函数:

var reduceFunction = function(key, amountVl) 
    reduceVal =  amount : 0 ;
    for (var idx = 0; idx < amountVl.length; idx++) 
        reduceVal.amount += amountVl[idx].amount; 
    
    return reduceVal;

使用您的示例数据生成:

 "_id" : "Macias Rosario", "value" :  "amount" : 756.6  

【讨论】:

以上是关于Pymongo MapReduce 作为子数组元素的总和的主要内容,如果未能解决你的问题,请参考以下文章

PyMongo 中的 MapReduce

如何根据数组是不是包含pymongo中的特定元素来更新所有文档?

为啥 Mongoose 插入 null 作为子文档数组的最后一个元素?

如何将具有元素数组的每个对象的对象列表转换为具有子元素作为属性的对象数组

如何填充作为另一个文档的数组元素的子文档的字段?

SwiftUI 将数组的元素作为绑定传递给子视图