面试题答案
一键面试计算每月总销售额
- Map函数:
- 在CouchDB视图的Map函数中,需要从每个销售记录文档中提取销售日期和销售金额。例如,假设文档格式为
{"sale_amount": 100, "sale_date": "2023 - 01 - 15"}
。 - 代码示例(JavaScript,CouchDB常用):
function (doc) { if (doc.sale_amount && doc.sale_date) { var parts = doc.sale_date.split('-'); var monthYear = parts[0] + '-' + parts[1]; emit(monthYear, doc.sale_amount); } }
- 上述代码将销售日期的年份和月份作为键(例如
2023 - 01
),销售金额作为值发射出去。
- 在CouchDB视图的Map函数中,需要从每个销售记录文档中提取销售日期和销售金额。例如,假设文档格式为
- Reduce函数:
- 对于计算每月总销售额,Reduce函数需要对相同月份的销售金额进行累加。
- 代码示例(JavaScript):
function (keys, values, rereduce) { if (rereduce) { return values.reduce(function (sum, value) { return sum + value; }, 0); } else { return values.reduce(function (sum, value) { return sum + value; }, 0); } }
- 在这个Reduce函数中,
keys
是Map函数发射的键(月份 - 年份),values
是对应键的销售金额数组。rereduce
参数用于处理CouchDB在分布式环境下可能的多次Reduce操作。如果rereduce
为true
,说明是在进行进一步的合并操作,无论rereduce
的值如何,这里都是对销售金额数组进行累加操作,返回每月的总销售额。
Reduce函数基本执行过程
- 本地Reduce:
- CouchDB首先在每个分区(Shard)上本地执行Reduce函数。Map函数发射的键值对会根据键进行分组,相同键的值会被收集到一个数组中传递给Reduce函数。例如,所有键为
2023 - 01
的值会被收集到一个数组,然后传递给Reduce函数进行本地累加计算,得到该分区内2023 - 01
月份的总销售额。
- CouchDB首先在每个分区(Shard)上本地执行Reduce函数。Map函数发射的键值对会根据键进行分组,相同键的值会被收集到一个数组中传递给Reduce函数。例如,所有键为
- 合并Reduce(如果需要):
- 在分布式环境中,可能存在多个分区。如果有多个分区,CouchDB会对每个分区的本地Reduce结果再次执行Reduce函数(此时
rereduce
为true
),将各个分区的结果合并起来,最终得到整个文档集合中每月的总销售额。这个过程确保了即使数据分布在多个节点上,也能正确计算出全局的结果。
- 在分布式环境中,可能存在多个分区。如果有多个分区,CouchDB会对每个分区的本地Reduce结果再次执行Reduce函数(此时