Map-Reduce
Map-Reduce是一种数据处理范例,用于将大量数据压缩为聚合结果。
注意
map-reduce操作已弃用。 聚合框架提供比map-reduce操作更好的性能和可用性,因此应该是新开发的首选框架。
通过在视图上调用map_reduce
方法,可以对从 Collection#find
方法获取的collection视图发出 map-reduce 操作。map_reduce
方法接受三个参数:映射器、化简器和 map-reduce 选项。 映射器和化简器必须作为包含 JavaScript 函数的字符串提供。
例如,给定以下包含值 1 到 10 的collection:
coll = client['foo'] 10.times do |i| coll.insert_one(v: i) end
以下调用将对小于 6 的值求和:
coll.find(v: {'$lt' => 6}).map_reduce( 'function() { emit(null, this.v) }', 'function(key, values) { return Array.sum(values) }', ).first['value'] # => 15.0
map_reduce
方法返回一个实例的Mongo::Collection::View::MapReduce
,即保存操作所用参数的 map-reduce 视图。要执行该操作,请迭代结果(通过使用例如 each
、 first
或to_a
在对象上)或调用execute
方法。 execute
方法发出 map-reduce 操作,但不从服务器返回结果集,主要在操作输出定向到collection时有用,如下所示:
coll.find(...).map_reduce(...).out('destination_collection').execute
请注意:
如果 map-reduce 的结果未定向到 collection,则称为内联检索。在这种情况下,整个结果集必须符合 16 MiB BSON 文档大小限制。
如果 map-reduce 的结果定向到一个集合,并且 map-reduce 视图进行迭代,则驱动程序会自动检索整个集合并将其内容作为结果集返回。 检索集合时无需排序。 如果对不为空的集合执行 map-reduce,则驱动程序将在 map-reduce 操作完成后返回集合中存在的文档,其中可能包括在执行 map-reduce 操作之前集合中存在的文档。操作。
coll.find(...).map_reduce(...).out('destination_collection').each do |doc| # ... end coll.find(...).map_reduce(...).out(replace: 'destination_collection', db: 'db_name').each do |doc| # ... end
给定一个 map-reduce 视图,可以使用以下方法进行配置:
方法 | 说明 |
---|---|
js_mode | 为操作设置 jsMode 标志。 |
out | 将输出定向到指定的collection,而不返回结果集。 |
scope | 设置操作范围。 |
verbose | 设置是否在结果中包含计时信息。 |
视图对象上定义了以下访问器方法:
方法 | 说明 |
---|---|
js_mode | 返回当前的 jsMode 标志值。 |
map_function | 以字符串形式返回该映射函数。 |
out | 返回操作的当前输出位置。 |
reduce_function | 以字符串形式返回 reduce 函数。 |
scope | 返回操作的当前范围。 |
verbose | 返回是否在结果中包含计时信息。 |