聚合(Aggregation)
聚合框架操作进程数据记录并返回计算结果。 聚合操作群组来自多个文档的值组合在一起,并且可以对分组的数据执行各种操作以返回单个结果。
聚合管道
聚合管道是一个基于数据处理管道概念的数据聚合框架。 文档进入多阶段管道,该管道将文档转换为聚合结果。
有关管道阶段和操作符的完整解释和完整列表,请参阅手册。
以下示例在 restaurants
样本数据集上使用聚合管道来查找按餐厅类别分组的五星级餐厅总数的列表。
client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'test') coll = client['restaurants'] aggregation = coll.aggregate([ { '$match'=> { 'stars'=> 5 } }, { '$unwind'=> '$categories'}, { '$group'=> { '_id'=> '$categories', 'fiveStars'=> { '$sum'=> 1 } } } ]) aggregation.each do |doc| #=> Yields a BSON::Document. end
在aggregate
方法中,第一个管道阶段会筛选除stars
字段中包含5
的文档之外的所有文档。 第二阶段展开categories
字段(一个数组),并将数组中的每个项目视为一个单独的文档。 第三阶段按类别对文档进行分组,并将匹配的 5 星结果数量相加。
聚合管道阶段具有最大内存使用限制。 要处理大型数据集,请将allowDiskUse
选项设置为 true,以便能够将数据写入临时文件。
您可以调用
aggregation
对象的allow_disk_use
方法,以获取设置了选项的新对象:
aggregation = coll.aggregate([ <aggregration pipeline expressions> ]) aggregation_with_disk_use = aggregation.allow_disk_use(true)
或者,您可以向
aggregate
方法传递一个选项:
aggregation = coll.aggregate([ <aggregration pipeline expressions> ], :allow_disk_use => true)
单一目的聚合操作
MongoDB 为某些聚合函数(包括计数和去重)提供了辅助方法。
数数
以下示例演示如何使用count
方法查找在categories
字段中具有精确数组[ 'Chinese', 'Seafood' ]
的文档总数。
client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'test') coll = client['restaurants'] aggregation = coll.count({ 'categories': [ 'Chinese', 'Seafood' ] }) count = coll.count({ 'categories' => [ 'Chinese', 'Seafood' ] })
注意
count
countDocuments
方法与countDocuments
$match
方法不同,可能不支持相同的筛选器。 使用聚合管道的 阶段来过滤文档。要学习;了解有关$match
阶段限制的更多信息,请参阅MongoDB Server手册中的 $match 限制。
distinct
distinct
辅助方法会消除包含值的结果,并为每个唯一值返回一条记录。
以下示例将返回restaurants
集合中categories
字段的唯一值列表:
client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'test') coll = client['restaurants'] aggregation = coll.distinct('categories') aggregation.each do |doc| #=> Yields a BSON::Document. end