db.collection. mapReduce
( map,reduce,{<out>,<query>,<sort>,<limit>,<finalize>,<scope>,<jsMode>,<verbose>})注意从4.2版开始,MongoDB弃用:
地图-reduce选项来_创建_一个新的分片集合以及使用的分片供选择的map-reduce。要输出到分片集合,请首先创建分片集合。MongoDB 4.2还不建议替换现有分片集合。 nonAtomic:false选项的显式规范。
注意视图不支持 map-reduce 操作。
map
key
关联或“maps”并发出key
和 value pair
。 有关详细信息,请参阅map Function 的要求。reduce
key
关联的values
。 有关详细信息,请参阅reduce Function 的要求。options
bypassDocumentValidation
out
inline
输出。 有关详细信息,请参阅选项。query
map
function 的文档。sort
limit
map
function 的最大文档数。finalize
reduce
方法并修改输出。 有关详细信息,请参阅finalize Function 的要求。scope
map
,reduce
和finalize
函数中可访问的 global 变量。jsMode
map
和reduce
函数之间将中间数据转换为 BSON 格式。 默认为false
。 如果false
: 1. 在内部,MongoDB 将map
function 发出的 JavaScript objects 转换为 BSON objects。然后在调用reduce
function 时将这些 BSON objects 转换回 JavaScript objects。 2. map-reduce 操作将中间 BSON object 放置在临时的 on-disk 存储中。这允许 map-reduce 操作在任意大的数据集上执行。 如果true
: 1. 在内部,map
function 期间发出的 JavaScript objects 仍然是 JavaScript objects。无需为reduce
function 转换 objects,这可以加快执行速度。 2. 您只能将jsMode
用于映射器emit()
function 中少于 500,000 个不同key
arguments 的结果_set。verbose
timing
信息。将verbose
设置为true
以包含timing
信息。 默认为false
。collation
locale
字段是必填字段;所有其他校对字段都是可选的。有关字段的说明,请参阅整理文件。 如果未指定排序规则但集合具有默认排序规则(请参阅db.createCollection()),则操作将使用为集合指定的排序规则。 如果没有为集合或操作指定排序规则,MongoDB 使用先前版本中用于 string 比较的简单二进制比较。 您无法为操作指定多个排序规则。对于 example,您不能为每个字段指定不同的排序规则,或者如果使用排序执行查找,则不能对查找使用一个排序规则,而对排序使用另一个排序规则。 version 3.4 中的新内容。注意map-reduce operations, group 命令和$where 运算表达式无法访问 mongo shell 中可用的某些 global 函数或 properties,例如 db。 可用的 PropertiesAvailable 函数
map-reduce operations
、$where
args
MaxKey
MinKey
assert()
BinData()
DBPointer()
DBRef()
doassert()
emit()
gc()
HexData()
hex_md5()
isNumber()
isObject()
ISODate()
isString()
Map()
MD5()
NumberInt()
NumberLong()
ObjectId()
print()
printjson()
printjsononeline()
sleep()
Timestamp()
tojson()
tojsononeline()
tojsonObject()
UUID()
version()
map
function 负责将每个输入文档转换为零个或多个文档。它可以访问scope
参数中定义的变量,并具有以下原型:map
function 具有以下要求:map
function 中,在 function 中将当前文档作为this
引用。map
function 不应出于任何原因访问数据库。map
function 应该是纯的,或者在 function 之外没有影响(即:side effects.)map
function 可以选择多次调用emit(key,value)
来创建一个将key
与value
相关联的输出文档。mapReduce
不再支持范围(即BSON类型15)的已弃用JavaScript 。该map
函数必须是BSON类型的String(即BSON类型2)或BSON类型的JavaScript(即BSON类型13)。要确定变量的范围,请使用 scope
参数。map
自版本4.2.1起,该功能不建议在范围内使用JavaScriptmap
function 将调用emit(key,value)
0 或 1 次,具体取决于输入文档的status
字段的 value:map
function 可能会多次调用emit(key,value)
,具体取决于输入文档的items
字段中的元素数:reduce
function 具有以下原型:reduce
function 表现出以下行为:reduce
function 不应该访问数据库,甚至不应该执行读操作。reduce
function 不应影响外部系统。reduce
function。 values
参数是一个 array,其元素是value
objects,它们被“映射”到key
。reduce
function。在这种情况下,该 key 的reduce
function 的前一个输出将成为该 key 的下一个reduce
function 调用的输入值之一。reduce
function 可以访问scope
参数中定义的变量。reduce
的输入不得大于 MongoDB 的最大 BSON 文件大小的一半。返回大型文档然后在后续的reduce
步骤中将其连接在一起时,可能会违反此要求。reduce
。要确定变量的范围,请改用scope
参数。reduce
function,所以以下 properties 需要 true:map
function 发出的value
的类型相同。reduce
function 必须是关联的。以下语句必须是 true:reduce
function 必须是幂等的。确保以下语句是 true:reduce
function 应该是可交换的:也就是说,valuesArray
中元素的 order 不应该影响reduce
function 的输出,因此以下语句是 true:out
参数指定以下选项:注意从4.2版开始,MongoDB弃用:
地图-reduce选项来_创建_一个新的分片集合以及使用的分片供选择的map-reduce。要输出到分片集合,请首先创建分片集合。MongoDB 4.2还不建议替换现有分片集合。 nonAtomic:false选项的显式规范。
out
时可用。它不适用于副本集 的辅助成员。out
具有以下参数:<action>
:指定以下操作之一:replace
<collectionName>
的集合存在,则替换<collectionName>
的内容。merge
reduce
reduce
function 应用于新文档和现有文档,并使用结果覆盖现有文档。db
:sharded
:true
并且您已在输出数据库上启用了分片,则 map-reduce 操作将使用_id
字段分割输出集合作为分片 key。true
和collectionName
是现有的未整数集合,map-reduce 将失败。nonAtomic
:注意开始在MongoDB中4.2,明确设置nonAtomic
到false
已被弃用。
merge
和reduce
输出模式应用**,这可能需要几分钟才能执行。nonAtomic
是false
,map-reduce 操作在 post-processing 期间锁定数据库。nonAtomic
是true
,则 post-processing step 会阻止 MongoDB 锁定数据库:在此 time 期间,其他 clients 将能够读取输出集合的中间状态。out
的唯一可用选项。finalize
function 具有以下原型:finalize
function 接收value 作为其 arguments 和reduce
function 的reducedValue
。意识到:finalize
function 不应出于任何原因访问数据库。finalize
function 应该是纯的,或者在 function 之外没有影响(即:side effects.)finalize
function 可以访问scope
参数中定义的变量。finalize
。要确定变量的范围,请改用scope
参数。聚合管道作为替代聚合管道比map-reduce提供更好的性能和更一致的接口。各种map-reduce表达式可以使用被重写聚合管道运算符,诸如$group
,$merge
等下面的示例包括聚合管道备选方案。
orders
使用以下文档创建样本集合:cust_id
对orders
集合执行 map-reduce 操作到 group,并为每个cust_id
计算price
的总和:this
指的是 map-reduce 操作正在处理的文档。cust_id
并发出cust_id
和price
键值对。keyCustId
和valuesPrices
定义相应的 reduce function:valuesPrices
是一个数组,其元素是 map function 发出的price
值,并按keyCustId
分组。valuesPrice
array 缩减为其元素的总和。mapFunction1
map function 和reduceFunction1
reduce function 对orders
集合中的所有文档执行 map-reduce。map_reduce_example
的集合。如果map_reduce_example
集合已存在,则操作将使用此 map-reduce 操作的结果替换内容。map_reduce_example
集合以验证结果:$group
由平台组cust_id
并计算value
字段(参见$sum
)。该 value
字段包含price
每个的总计cust_id
。$out
将输出写入collection agg_alternative_1
。或者,您可以使用 $merge
代替$out
。agg_alternative_1
集合以验证结果:orders
集合执行 map-reduce 操作,以处理ord_date
value 大于01/01/2012
的所有文档。操作按item.sku
字段分组,并计算每个sku
的订单数量和订购总数量。然后,该操作将为每个值计算每个订单的平均数量,并将结果合并到输出集合中。合并结果时,如果现有文档的密钥与新结果相同,则该操作将覆盖现有文档。如果不存在具有相同密钥的文档,则该操作将插入该文档。this
指的是 map-reduce 操作正在处理的文档。sku
与一个新的 object value
相关联,该对象 value
包含订单的count
和_ite用于 order 并发出sku
和value
对。keySKU
和countObjVals
定义相应的 reduce function:countObjVals
是一个 array,其元素是映射到 map function 传递给 reducer function 的分组keySKU
值的 objects。countObjVals
array 缩减为包含count
和qty
字段的单个 object reducedValue
。reducedVal
中,count
字段包含来自各个 array 元素的count
字段的总和,qty
字段包含来自各个 array 元素的qty
字段的总和。key
和reducedVal
定义 finalize function。 function 修改reducedVal
object 以添加名为avg
的计算字段并返回修改后的 object:mapFunction2
,reduceFunction2
和finalizeFunction2
函数对orders
集合执行 map-reduce 操作。query
字段仅选择ord_date
大于new Date(01/01/2012)
的文档。然后它将结果输出到集合map_reduce_example
。如果map_reduce_example
集合已存在,则操作将现有内容与此 map-reduce 操作的结果合并。也就是说,如果现有文档具有与新结果相同的密钥,则该操作将覆盖现有文档。如果不存在具有相同密钥的文档,则该操作将插入该文档。map_reduce_example2
集合以验证结果:$match
阶段仅选择ord_date
大于或等于的那些文档。new Date("2020-03-01")
$unwinds
阶段按items
数组字段细分文档,以输出每个数组元素的文档。例如:$group
由平台组items.sku
,计算每个SKU:qty
字段。该qty
字段包含qty
每个订单的总数items.sku
(请参阅参考资料$sum
)。orders_ids
阵列。该orders_ids
字段包含不同顺序的阵列_id
的对items.sku
(参见 $addToSet
)。$project
阶段调整输出文档的形状以反映map-reduce的输出,该输出具有两个字段_id
和 value
。该$project
sets:value.count
的尺寸在orders_ids
数组中。(请参阅$size
。)value.qty
在qty
输入文档的字段。value.avg
每订购数量的平均数目。(请参阅$divide
和$size
。)$merge
将输出写入collection agg_alternative_3
。如果现有文档的密钥_id
与新结果相同,则该操作将覆盖现有文档。如果不存在具有相同密钥的文档,则该操作将插入该文档。agg_alternative_3
集合以验证结果:db.collection.mapReduce()
不再支持 afterClusterTime。因此, db.collection.mapReduce()
不能与因果一致的会话相关联 。