聚合
聚合框架操作处理数据记录并返回计算结果。聚合操作将多个文档中的值组合在一起,并可以对组合数据进行各种操作,以返回单个结果。
聚合管道
聚合管道是一个基于数据处理管道概念的数据聚合框架。文档进入一个多阶段管道,将文档转换为聚合结果。
有关详细说明和完整管道阶段和操作符列表,请参阅手册。
以下示例使用聚合管道在restaurants
示例数据集上找到按餐厅类别分组的5星级餐厅总数列表。
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 以启用将数据写入临时文件。
您可以通过调用
allow_disk_use
方法来获取一个选项已设置的新的aggregation
对象
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 和 distinct。
计数
以下示例演示了如何使用 count
方法来查找具有精确数组 [ 'Chinese', 'Seafood' ]
的 categories
字段的文档总数。
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' ] })
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