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函数:
countObjVals
keySKU
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
定义finaliz
e函数。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.