On this page本页内容
In the 在mongo shell, the db.collection.mapReduce() method is a wrapper around the mapReduce command. mongo shell中,db.collection.mapReduce()方法是mapReduce命令的包装器。The following examples use the 以下示例使用db.collection.mapReduce() method:db.collection.mapReduce()方法:
Aggregation Pipeline as Alternative聚合管道作为替代方案
Aggregation pipeline provides better performance and a simpler interface than map-reduce, and map-reduce expressions can be rewritten using aggregation pipeline operators such as 聚合管道提供了比map-reduce更好的性能和更简单的接口,并且可以使用聚合管道运算符(如$group, $merge, and others.$group、$merge等)重写map-reduce表达式。
For map-reduce expressions that require custom functionality, MongoDB provides the 对于需要自定义功能的map-reduce表达式,MongoDB从4.4版开始提供$accumulator and $function aggregation operators starting in version 4.4. These operators provide the ability to define custom aggregation expressions in JavaScript.$accumulator和$function聚合运算符。这些运算符提供了在JavaScript中定义自定义聚合表达式的能力。
The examples in this section include aggregation pipeline alternatives without custom aggregation expressions. 本节中的示例包括没有自定义聚合表达式的聚合管道备选方案。For alternatives that use custom expressions, see Map-Reduce to Aggregation Pipeline Translation Examples.有关使用自定义表达式的替代方案,请参阅对聚合管道转换Map-Reduce示例。
Create a sample collection 使用以下文档创建orders with these documents:orders示例:
Perform the map-reduce operation on the 对orders collection to group by the cust_id, and calculate the sum of the price for each cust_id:orders集合执行map-reduce操作以按cust_id分组,并计算每个cust_id的price总和:
this refers to the document that the map-reduce operation is processing.this指的是map-reduce操作正在处理的文档。price to the cust_id for each document and emits the cust_id and price.price映射到每个文档的cust_id,并发出cust_id和价格。keyCustId and valuesPrices:keyCustId和valuesprice定义相应的reduce函数:
valuesPrices is an array whose elements are the price values emitted by the map function and grouped by keyCustId.valuesPrices是一个数组,其元素是map函数发出的价格值,并按keyCustId分组。valuesPrice array to the sum of its elements.valuesPrice数组减少为其元素之和。orders collection using the mapFunction1 map function and the reduceFunction1 reduce function:mapFunction1映射函数和reduceFunction1缩减函数对orders集合中的所有文档执行map-reduce:
This operation outputs the results to a collection named 此操作将结果输出到名为map_reduce_example. map_reduce_example的集合。If the 如果map_reduce_example collection already exists, the operation will replace the contents with the results of this map-reduce operation.map_reduce_example集合已存在,则该操作将使用此map-reduce操作的结果替换内容。
map_reduce_example collection to verify the results:map_reduce_example集合以验证结果:
The operation returns these documents:该操作将返回以下文档:
Using the available aggregation pipeline operators, you can rewrite the map-reduce operation without defining custom functions:使用可用的聚合管道操作符,您可以重写map-reduce操作,而无需定义自定义函数:
$group stage groups by the cust_id and calculates the value field using $sum. $group阶段按cust_id分组,并使用$sum计算value字段。value field contains the total price for each cust_id.value字段包含每个cust_id的总价。
This stage outputs these documents to the next stage:本阶段将这些文件输出到下一阶段:
$out writes the output to the collection agg_alternative_1. $out将输出写入集合agg_alternative_1。$merge instead of $out.$merge而不是$out。agg_alternative_1 collection to verify the results:agg_alternative_1集合以验证结果:
The operation returns these documents:该操作将返回以下文档:
See also参阅
For an alternative that uses custom aggregation expressions, see Map-Reduce to Aggregation Pipeline Translation Examples.有关使用自定义聚合表达式的替代方法,请参阅映射-减少到聚合管道转换示例。
In the following example, you will see a map-reduce operation on the 在以下示例中,您将看到orders collection for all documents that have an ord_date value greater than or equal to 2020-03-01.orders集合上ord_date值大于或等于2020-03-01的所有文档的的map-reduce操作。
The operation in the example:示例中的操作如下:
item.sku field, and calculates the number of orders and the total quantity ordered for each sku.item.sku字段分组,并计算每个sku的订单数量和订购总量。sku value and merges the results into the output collection.sku值的每个订单的平均数量,并将结果合并到输出集合中。When merging results, if an existing document has the same key as the new result, the operation overwrites the existing document. 合并结果时,如果现有文档与新结果具有相同的键,则该操作将覆盖现有文档。If there is no existing document with the same key, the operation inserts the document.如果没有具有相同密钥的现有文档,则操作将插入该文档。
Example steps:示例步骤:
this refers to the document that the map-reduce operation is processing.this引用正在被处理的映射-减少操作的文档。sku with a new object value that contains the count of 1 and the item qty for the order and emits the sku (stored in the key) and the value.sku与一个新的对象value关联,该对象value包含订单数目count: 1和项目数量qty,并发出sku(存储在key中)和value。keySKU and countObjVals:keySKU和countObjVals定义相应的reduce函数:
countObjValskeySKU values passed by map function to the reducer function.map函数传递给reducer函数的分组keySKU值的对象。countObjVals array to a single object reducedValue that contains the count and the qty fields.countObjVals数组缩减为单个对象reducedValue,其中包含count和qty字段。reducedVal, the count field contains the sum of the count fields from the individual array elements, and the qty field contains the sum of the qty fields from the individual array elements.reducedVal中,count字段包含单个数组元素的count字段之和,qty字段包含单个数组元素的qty字段之和。key and reducedVal. key和reducedVal定义finalize函数。reducedVal object to add a computed field named avg and returns the modified object:reducedVal对象以添加名为avg的计算字段,并返回修改后的对象:
orders collection using the mapFunction2, reduceFunction2, and finalizeFunction2 functions:mapFunction2、reduceFunction2和finalizeFunction2函数对orders集合执行map reduce操作:
This operation uses the 该操作使用query field to select only those documents with ord_date greater than or equal to new Date("2020-03-01"). query字段只选择ord_date大于或等于new Date("2020-03-01")的文档。Then it outputs the results to a collection 然后,它将结果输出到集合map_reduce_example2.map_reduce_example2。
If the map_reduce_example2 collection already exists, the operation will merge the existing contents with the results of this map-reduce operation. That is, if an existing document has the same key as the new result, the operation overwrites the existing document. If there is no existing document with the same key, the operation inserts the document.
map_reduce_example2 collection to verify the results:
The operation returns these documents:
Using the available aggregation pipeline operators, you can rewrite the map-reduce operation without defining custom functions:
$match stage selects only those documents with ord_date greater than or equal to new Date("2020-03-01").$unwinds stage breaks down the document by the items array field to output a document for each array element. $group stage groups by the items.sku, calculating for each sku:
qty field. The qty field contains the total qty ordered per each items.sku using $sum.orders_ids array. The orders_ids field contains an array of distinct order _id’s for the items.sku using $addToSet.$project stage reshapes the output document to mirror the map-reduce’s output to have two fields _id and value. The $project sets:
$merge writes the output to the collection agg_alternative_3. If an existing document has the same key _id as the new result, the operation overwrites the existing document. If there is no existing document with the same key, the operation inserts the document.agg_alternative_3 collection to verify the results:
The operation returns these documents:
See also参阅
For an alternative that uses custom aggregation expressions, see Map-Reduce to Aggregation Pipeline Translation Examples.