文档菜单
文档首页
/ / /
Ruby MongoDB 驱动
/

聚合

本页内容

  • 聚合管道
  • 单用途聚合操作
  • 计数
  • 不同

聚合框架操作处理数据记录并返回计算结果。聚合操作将多个文档中的值组合在一起,并可以对组合数据进行各种操作,以返回单个结果。

聚合管道是一个基于数据处理管道概念的数据聚合框架。文档进入一个多阶段管道,将文档转换为聚合结果。

有关详细说明和完整管道阶段和操作符列表,请参阅手册。

以下示例使用聚合管道在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 为某些聚合函数提供了辅助方法,包括 countdistinct

以下示例演示了如何使用 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 辅助方法会消除包含值的重复结果,并为每个唯一值返回一条记录。

以下示例返回了 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

返回

投影