MongoDB聚合函数转Map-Reduce(Python):空结果问题求助
MongoDB MapReduce返回空结果的问题修复
你的MapReduce代码存在三个关键错误,导致返回空结果且未匹配原聚合的统计需求:
错误点解析
- 字段访问语法错误:MongoDB的JavaScript map函数中,访问文档字段不需要加
$符号,this.$ID和this.$price写法错误,应改为this.ID和this.price。 - 集合名称错误:
current_db.command中指定的集合名是'collection2',但实际目标集合是'Abonement bought',MapReduce找不到对应集合因此返回空结果。 - 统计逻辑不完整:原聚合需求是统计每个ID的订单数量(Total)和总收入(revenue),但你的代码仅处理了收入统计,未包含数量统计逻辑。
修正后的MapReduce代码
def mapReduce(): # 修正map函数:emit键为ID,值包含订单计数和单价 mapf = """ function() { emit(this.ID, {Total: 1, revenue: this.price}); } """ # 修正reduce函数:累加订单数量和总收入 reducef = """ function(key, values) { var result = {Total: 0, revenue: 0}; values.forEach(function(value) { result.Total += value.Total; result.revenue += value.revenue; }); return result; } """ # 修正集合名称为实际的'Abonement bought' result = current_db.command( 'mapReduce', 'Abonement bought', map=mapf, reduce=reducef, out={'inline': 1}) # 格式化输出结果 for doc in result['results']: print(f"ID: {doc['_id']}, 订单数量: {doc['value']['Total']}, 总收入: {doc['value']['revenue']}") mapReduce()
运行结果说明
修正后执行代码会输出与原聚合函数一致的结果:
ID: 1000, 订单数量: 2, 总收入: 40 ID: 1002, 订单数量: 1, 总收入: 300
内容的提问来源于stack exchange,提问作者Laura_777
相关产品推荐
相关产品推荐

