Docs 菜单
Docs 主页
/ / /
Ruby MongoDB 驱动程序
/

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 视图。要执行该操作,请迭代结果(通过使用例如 eachfirstto_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
返回是否在结果中包含计时信息。

后退

聚合(Aggregation)