Docs 菜单
Docs 主页
/ / /
Scala
/

聚合

在此页面上

  • 匹配
  • 项目
  • 计算字段
  • 抽检 (Sample)
  • Sort
  • 跳过
  • Limit
  • Lookup
  • GROUP
  • Unwind
  • SetWindowFields
  • 组装管道

聚合 类提供用于构建 聚合管道阶段 的静态工厂方法。每个方法都返回一个 Bson类型的实例,而该实例又可以传递给MongoCollection.aggregate()方法。

您可以静态导入Aggregates类的方法,如以下代码所示:

import org.mongodb.scala.model.Aggregates._

本指南中的示例假定此静态导入。

$match管道阶段将与指定过滤匹配的所有文档传递到下一阶段。 虽然过滤可以是实现Bson的任何类的实例,但使用筛选器类中的方法会更方便。

以下示例创建了一个管道阶段,用于匹配author字段值为"Dave"的所有文档:

`match`(equal("author", "Dave"))

注意

由于match是Scala中的保留字,必须用反引号转义,因此您可能更愿意使用filter()别名:

filter(equal("author", "Dave"))

$project管道阶段将所有文档的投影字段传递到下一阶段。 虽然投影可以是任何实现Bson的类的实例,但使用Projections类中的方法会更方便。

以下示例创建一个管道阶段,其中不包括 _id 字段,但包括 titleauthor 字段:

project(fields(include("title", "author"), excludeId()))

$project 阶段也可以投影计算字段。

以下示例将qty字段到名为quantity的新字段。 换句话说,它会重命名该字段:

project(computed("quantity", "$qty"))

$sample管道阶段从输入文档中随机选择N文档。 以下示例使用sample()方法从集合中随机选择5文档:

sample(5)

$sort管道阶段将所有文档传递到下一阶段,并按指定的排序条件进行排序。 虽然排序条件可以是任何实现Bson的类的实例,但使用Sorts类中的方法会更方便。

以下示例创建了管道阶段,根据 age 字段的值以降序排序,然后根据 posts 字段的值以升序排序:

sort(orderBy(descending("age"), ascending("posts")))

$skip管道阶段会跳过进入该阶段的指定数量的文档,并将剩余文档传递到下一阶段。

以下示例会跳过前5个文档:

skip(5)

$limit管道阶段限制传递到下一阶段的文档数量。

以下示例将文档数量限制为10 :

limit(10)

$lookup管道阶段与另一个集合执行左外连接,以过滤已连接集合中的文档进行处理。

以下示例对fromCollection集合执行左外连接,将local字段连接到from字段,并在joinedOutput字段中输出:

lookup("fromCollection", "local", "from", "joinedOutput")

$group管道阶段按某些指定的表达式对文档进行分组,并将每个不同分组的文档输出到下一阶段。 一个群组由_id和零个或多个累加器组成,其中 指定了要群组的表达式,而零个或多个累加器则针对每个分组进行评估。

为了简化累加器的表达式,驱动程序包含一个Accumulators单例对象,其中包含每个受支持累加器的工厂方法。

以下示例按customerId字段的值对文档进行分组,并将每个群组的数量字段值的总和和平均值分别累加到totalQuantityaverageQuantity字段中:

group("$customerId", sum("totalQuantity", "$quantity"), avg("averageQuantity", "$quantity"))

$unwind管道阶段解构输入文档中的大量字段,为每个元素输出一个文档。

以下示例为每个文档输出sizes数组中每个元素的文档:

unwind("$sizes")

以下示例还包括sizes字段缺失值或 null 值,或者sizes列表为空的任何文档:

unwind("$sizes", UnwindOptions().preserveNullAndEmptyArrays(true))

以下示例展开sizes数组,并将数组索引输出到position字段中:

unwind("$sizes", UnwindOptions().includeArrayIndex("$position"))

$setWindowFields管道阶段允许使用窗口操作符。 此阶段对输入文档进行分区,类似于 $group管道阶段,可以选择对它们进行排序,通过在每个函数指定的Windows上计算窗口函数来计算文档中的字段,然后输出文档。 窗口是分区的子集。

$group管道阶段的重要区别在于,属于同一分区或窗口的文档不会折叠为单个文档。

驾驶员包含WindowedComputations单例对象,其中包含受支持窗口操作符的工厂方法。

以下示例根据rainfalltemperature字段中提供的更细粒度的测量值,计算每个地点过去一个月的累计降雨量和平均气温:

val pastMonth: Window = Windows.timeRange(-1, MongoTimeUnit.MONTH, Windows.Bound.CURRENT)
setWindowFields(Some("$localityId"), Some(Sorts.ascending("measurementDateTime")),
WindowedComputations.sum("monthlyRainfall", "$rainfall", Some(pastMonth)),
WindowedComputations.avg("monthlyAvgTemp", "$temperature", Some(pastMonth)))

管道操作符通常组合成一个列表并传递给MongoCollectionaggregate()方法:

collection.aggregate(List(filter(equal("author", "Dave")),
group("$customerId", sum("totalQuantity", "$quantity"),
avg("averageQuantity", "$quantity")),
out("authors")))

后退

排序