MongoDB\Collection::mapReduce()
自 1.12 版起已弃用。
版本 1.2 中的新增内容。
定义
MongoDB\Collection::mapReduce()
mapReduce命令允许您对集合运行 map-reduce 聚合操作。
function mapReduce( MongoDB\BSON\JavascriptInterface $map, MongoDB\BSON\JavascriptInterface $reduce, string|array|object $out, array $options = [] ): MongoDB\MapReduceResult
参数
$map
: MongoDB\BSON\Javascript将值与键关联或“映射”并发出键值对的 JavaScript 函数。
注意
不推荐使用传递带有作用域的 Javascript 实例的方式。 将所有范围变量放在 MapReduce 操作的
scope
选项中。$reduce
: MongoDB\BSON\Javascript一个 JavaScript 函数,用于将与特定键关联的所有值“减少”为单个对象。
注意
不推荐使用传递带有作用域的 Javascript 实例的方式。 将所有范围变量放在 MapReduce 操作的
scope
选项中。$out
:字符串|数组|对象- 指定输出 map-reduce 操作结果的位置。 您可以输出到collection,也可以以内联方式返回结果。在副本集的主节点上,您可以输出到collection或内联,但在从节点上,只能内联输出。
$options
: array指定所需选项的数组。
名称类型说明bypassDocumentValidation布尔如果为
true
,则允许写入操作规避文档级验证。默认为false
。这仅适用于将结果输出到collection的情况。
排序规则数组|对象comment混合finalize遵循 reduce 方法并修改输出。
不推荐使用传递带有作用域的 Javascript 实例的方式。 将所有范围变量放在 MapReduce 操作的
scope
选项中。jsMode布尔指定是否在执行 map 和 reduce 函数之间将中间数据转换为 BSON 格式。limit整型指定输入到地图函数的最大文档数。maxTimeMS整型处理游标操作的累计时间限制(以毫秒为单位)。MongoDB 最早会在中断点之后中止操作。
查询数组|对象使用查询操作符指定选择条件,以确定输入到映射函数的文档。事务外的readPreference读取要用于操作的偏好。 默认为集合的读取偏好。
将结果输出到collection时,将忽略此选项。
范围数组|对象指定可在 map、reduce 和 finalize 函数中访问的全局变量。会话与操作相关联的客户端会话。
1.3 版本中的新增功能。
sort数组|对象对结果排序的排序规范。typeMap阵列类型映射 应用于游标,决定如何将 BSON 文档转换为 PHP 值。默认为集合的类型映射。
verbose布尔指定是否在结果信息中包含定时信息。writeConcern
Return Values
一个 MongoDB\MapReduceResult
对象,允许对map-reduce结果进行迭代,而与输出方法无关(例如 inline, 集合) 通过 IteratorAggregate 接口。它还提供对命令统计信息的访问权限。
错误/异常
MongoDB\Exception\UnsupportedException
,如果所选服务器使用了选项但不支持选项(例如collation
、readConcern
、writeConcern
)。
MongoDB\Exception\InvalidArgumentException
用于与参数或选项解析相关的错误。
MongoDB\Exception\UnexpectedValueException
,如果来自服务器的命令响应格式错误。
MongoDB\ 驱动程序\Exception\RuntimeException 对于扩展级别的其他错误(例如连接错误)。
行为
在MongoDB中, map-reduce操作可以写入集合或以内联方式返回结果。 如果写入map-reduce输出写入集合,则可以对同一输入集合执行后续map-reduce操作,将新结果与以前的结果进行合并替换、合并或减少。 有关详细信息和示例,请参阅Map-Reduce和执行增量 Map-Reduce 。
返回map-reduce操作inline的结果时,结果文档必须在BSON文档大小限制(当前为16 MB)之内。
MongoDB 支持对分片集合执行 map-reduce 操作。 Map-reduce 操作还可以将结果输出到分片集合。 请参阅Map-Reduce 和分片集合。
例子
此示例将使用城市人口来计算每个州的总人口。
$collection = (new MongoDB\Client)->test->zips; $map = new MongoDB\BSON\Javascript('function() { emit(this.state, this.pop); }'); $reduce = new MongoDB\BSON\Javascript('function(key, values) { return Array.sum(values) }'); $out = ['inline' => 1]; $populations = $collection->mapReduce($map, $reduce, $out); foreach ($populations as $pop) { var_dump($pop); };
而输出将类似如下所示:
object(stdClass)#2293 (2) { ["_id"]=> string(2) "AK" ["value"]=> float(544698) } object(stdClass)#2300 (2) { ["_id"]=> string(2) "AL" ["value"]=> float(4040587) } object(stdClass)#2293 (2) { ["_id"]=> string(2) "AR" ["value"]=> float(2350725) } object(stdClass)#2300 (2) { ["_id"]=> string(2) "AZ" ["value"]=> float(3665228) }
另请参阅
MongoDB 手册中的mapReduce命令参考
MongoDB手册中的Map-Reduce文档