推荐答案
// www.javascriptcn.com code example
db.collection.mapReduce(
function() {
emit(this.key, this.value);
},
function(key, values) {
return Array.sum(values);
},
{
out: "result_collection"
}
);本题详细解读
1. mapReduce() 方法概述
mapReduce() 是 MongoDB 中用于执行 MapReduce 操作的方法。它允许你对集合中的数据进行复杂的聚合操作。MapReduce 操作分为两个阶段:Map 阶段和 Reduce 阶段。
2. Map 阶段
在 Map 阶段,MongoDB 会对集合中的每个文档执行 map 函数。map 函数的作用是将文档转换为键值对(key-value pairs),并通过 emit() 函数输出这些键值对。
function() {
emit(this.key, this.value);
}this指向当前文档。emit(key, value)函数用于生成键值对,key是分组的依据,value是需要聚合的值。
3. Reduce 阶段
在 Reduce 阶段,MongoDB 会对 Map 阶段输出的键值对进行分组,并对每个键对应的值列表执行 reduce 函数。reduce 函数的作用是将这些值聚合为一个单一的值。
function(key, values) {
return Array.sum(values);
}key是 Map 阶段输出的键。values是与该键对应的值列表。Array.sum(values)是一个简单的聚合操作,将值列表中的所有值相加。
4. 输出结果
mapReduce() 方法的第三个参数是一个选项对象,用于指定输出结果的方式。常见的选项包括:
out: 指定输出结果的集合名称。如果集合不存在,MongoDB 会自动创建它。
{
out: "result_collection"
}5. 示例
假设我们有一个 sales 集合,其中包含以下文档:
{ "_id": 1, "product": "A", "quantity": 10 }
{ "_id": 2, "product": "B", "quantity": 20 }
{ "_id": 3, "product": "A", "quantity": 30 }我们可以使用 mapReduce() 来计算每个产品的总销量:
// www.javascriptcn.com code example
db.sales.mapReduce(
function() {
emit(this.product, this.quantity);
},
function(key, values) {
return Array.sum(values);
},
{
out: "total_sales"
}
);执行后,total_sales 集合将包含以下结果:
{ "_id": "A", "value": 40 }
{ "_id": "B", "value": 20 }6. 注意事项
mapReduce()操作可能会比较慢,尤其是在处理大量数据时。- 在某些情况下,使用聚合管道(Aggregation Pipeline)可能比
mapReduce()更高效。 mapReduce()的输出结果可以是一个集合,也可以直接返回给客户端。