mapReduce
¶该mapReduce
命令允许您在集合上运行
映射减少聚合操作。
注意
从4.2版开始,MongoDB弃用:
该
mapReduce
命令具有以下原型形式:
将集合的名称传递给mapReduce
命令(即<collection>
),以用作执行map-reduce操作的源文档。
注意
视图不支持map-reduce操作。
该命令还接受以下参数:
领域 | 类型 | 描述 |
---|---|---|
mapReduce |
采集 | 您要对其执行map-reduce的集合的名称。该集合将在使用query 该map 函数处理之前进行过滤。 |
map |
功能 | 一个将a 有关更多信息,请参见地图功能的要求。 |
reduce |
功能 | 一种JavaScript函数,可将“减少”到 有关更多信息,请参见reduce函数的要求。 |
out |
字符串或文件 | 指定在何处输出map-reduce操作的结果。您可以输出到集合,也可以内联返回结果。在副本集的 主要成员上,您可以输出到集合或内联,但是在次要上,只能进行内联输出。 请参阅选项以获取更多信息。 |
query |
文献 | 可选的。使用查询运算符指定选择标准,以确定输入到map 功能的文档
。 |
sort |
文献 | 可选的。对输入文档进行排序。此选项对于优化很有用。例如,将排序键指定为与发射键相同,以便减少还原操作。排序键必须在此集合的现有索引中。 |
limit |
数 | 可选的。指定用于输入map 功能的最大文档数
。 |
finalize |
功能 | 可选的。遵循该 有关更多信息,请参见终结函数的要求。 |
scope |
文献 | 可选的。指定的全局变量是在访问map ,
reduce 和finalize 功能。 |
jsMode |
布尔值 | 可选的。指定在 默认为 如果
如果
|
verbose |
布尔值 | 可选的。指定是否 默认为 |
bypassDocumentValidation |
布尔值 | 可选的。允许 3.2版中的新功能。 |
collation |
文献 | 可选的。 指定 用于操作的排序规则。 归类允许用户为字符串比较指定特定于语言的规则,例如字母大写和重音符号的规则。 排序规则选项具有以下语法: 指定排序规则时,该 如果未指定排序规则,但是集合具有默认排序规则(请参阅参考资料 如果没有为集合或操作指定排序规则,则MongoDB使用先前版本中使用的简单二进制比较进行字符串比较。 您不能为一个操作指定多个排序规则。例如,您不能为每个字段指定不同的排序规则,或者如果对排序执行查找,则不能对查找使用一种排序规则,而对排序使用另一种排序规则。 3.4版的新功能。 |
writeConcern |
文献 | 可选的。表示输出到集合时要使用的写关注点的文档。省略使用默认的写关注。 |
以下是mapReduce
命令的原型用法:
map
功能¶该map
函数负责将每个输入文档转换为零个或多个文档。它可以访问参数中定义的变量scope
,并具有以下原型:
该map
功能具有以下要求:
map
函数中,请在函数中引用当前文档this
。map
功能应该不以任何理由访问数据库。map
功能应该是纯净的,或者对功能没有任何影响(即副作用)。map
函数可以任选地调用emit(key,value)
任意次数以创建输出文件相关联的key
用value
。map
。要限制变量的范围,请改用scope
参数。以下map
函数将调用emit(key,value)
0或1次,具体取决于输入文档status
字段的值
:
根据输入文档字段中元素的数量,以下map
函数可能会emit(key,value)
多次调用items
:
reduce
功能¶该reduce
函数具有以下原型:
该reduce
函数具有以下行为:
reduce
功能应该不访问数据库,甚至执行读操作。reduce
功能应该不会影响到系统外部。reduce
为只有单个值的键调用该函数。所述values
参数是一个数组,其元素是value
被“映射”到的对象
key
。reduce
为同一键多次调用该函数。在这种情况下,该reduce
键的功能先前的输出将成为该键的下一个reduce
功能调用的输入值之一
。reduce
函数可以访问参数中定义的变量scope
。reduce
不得大于MongoDB的最大BSON文档大小的一半
。当返回大文档然后在后续reduce
步骤中将其合并在一起时,可能会违反此要求。reduce
。要限制变量的范围,请改用scope
参数。因为可以reduce
为同一键多次调用该函数,所以以下属性必须为true:
返回对象的类型必须与value
该map
函数发出
的类型相同。
该reduce
功能必须是关联的。以下陈述必须为真:
该reduce
功能必须是幂等的。确保以下语句为真:
该reduce
函数应该是可交换的:也就是说,中元素的顺序valuesArray
不应影响该reduce
函数的输出
,因此以下语句为真:
finalize
功能¶该finalize
函数具有以下原型:
的finalize
函数接收作为其自变量的key
值和reducedValue
从所述reduce
功能。意识到:
finalize
功能应该不以任何理由访问数据库。finalize
功能应该是纯净的,或者对功能没有任何影响(即副作用)。finalize
函数可以访问参数中定义的变量scope
。finalize
。要限制变量的范围,请改用scope
参数。out
选项¶您可以为out
参数指定以下选项:
此选项输出到新集合,在副本集的辅助成员上不可用。
注意
从4.2版开始,MongoDB弃用:
仅当将已经存在的集合传递给时,此选项才可用out
。在副本集的辅助成员上不可用。
当您通过操作输出到集合时,out
具有以下参数:
<action>
:指定以下操作之一:
replace
<collectionName>
如果<collectionName>
存在集合,则替换的内容。
merge
如果输出集合已经存在,则将新结果与现有结果合并。如果现有文档的密钥与新结果相同,则覆盖该现有文档。
reduce
如果输出集合已经存在,则将新结果与现有结果合并。如果现有文档的密钥与新结果的密钥相同,则将该reduce
功能应用于新文档和现有文档,并用结果覆盖现有文档。
db
:
可选的。您希望map-reduce操作写入其输出的数据库的名称。默认情况下,该数据库将与输入集合相同。
sharded
:
注意
从4.2版开始,不建议使用该sharded
选项。
可选的。如果true
并且您已在输出数据库上启用分片,则map-reduce操作将使用_id
字段作为分片键对输出集合进行分片。
如果true
和collectionName
是现有的未分片集合,则map-reduce失败。
nonAtomic
:
注意
从MongoDB 4.2开始,不建议显式设置nonAtomic
为false
。
可选的。将输出操作指定为非原子操作。这适用只
对merge
和reduce
输出模式,这可能需要几分钟来执行。
默认情况下nonAtomic
为false
,并且map-reduce操作在后处理期间锁定数据库。
如果nonAtomic
为true
,则后处理步骤将阻止MongoDB锁定数据库:在这段时间内,其他客户端将能够读取输出集合的中间状态。
如果您的MongoDB部署强制执行身份验证,则执行mapReduce
命令的用户必须拥有以下特权操作:
带输出选项的Map-reduce :{out : inline}
输出到集合replace
时使用动作进行map-reduce :
输出到集合时使用merge
或reduce
动作进行
Map-reduce :
该readWrite
内置角色提供了必要的权限来执行的map-reduce聚集。
MongoDB驱动程序会自动将afterClusterTime设置为与因果一致的会话相关联的操作。从MongoDB 4.2开始,该
mapReduce
命令不再支持afterClusterTime。因此,mapReduce
不能与因果一致的会话相关联。
在mongo
外壳中,该db.collection.mapReduce()
方法是mapReduce
命令的包装。以下示例使用该db.collection.mapReduce()
方法:
聚合管道作为替代
聚合流水线 比map-reduce提供更好的性能和更一致的接口。
各种地图-减少表达式可以使用被重写聚合管道运营商,诸如$group
,
$merge
等
下面的示例包括聚合管道备选方案。
orders
使用以下文档创建样本集合: