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

聚合(Aggregation)

在此页面上

  • 聚合管道
  • 单一目的聚合操作
  • 数数
  • distinct

聚合框架操作进程数据记录并返回计算结果。 聚合操作群组来自多个文档的值组合在一起,并且可以对分组的数据执行各种操作以返回单个结果。

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

有关管道阶段和操作符的完整解释和完整列表,请参阅手册。

以下示例在 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' ] })

注意

countcountDocuments方法与countDocuments $match方法不同,可能不支持相同的筛选器。 使用聚合管道的 阶段来过滤文档。要学习;了解有关$match 阶段限制的更多信息,请参阅MongoDB Server手册中的 $match 限制。

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

后退

投射