集計
の 集計 クラスには、 集計パイプライン ステージ を構築する静的ファクトリー メソッドが用意されています。各メソッドは 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
を実装する任意のクラスのインスタンスでもかまいませんが、プロジェクションクラスのメソッドを使用すると便利です。
次の例では、 _id
フィールドを除外するものの、 title
フィールドとauthor
フィールドを含むパイプライン ステージを作成します。
project(fields(include("title", "author"), excludeId()))
計算フィールド
$project
ステージは計算フィールドもプロジェクションできます。
次の例では、 qty
フィールドをquantity
という新しいフィールドにプロジェクションします。 つまり、フィールドの名前が次のように変更されます。
project(computed("quantity", "$qty"))
サンプル
$sample
パイプライン ステージは、入力ドキュメントからN
ドキュメントをランダムに選択します。 次の例では、 sample()
メソッドを使用して、コレクションからランダムに5
ドキュメントを選択します。
sample(5)
Sort
$sort
パイプライン ステージは、指定されたソート条件でソートされて、すべてのドキュメントを次のステージに渡します。 並べ替え条件はBson
を実装するクラスのインスタンスにすることもできますが、 Sortsクラスのメソッドを使用すると便利です。
次の例では、 age
フィールドの値に従って降順でソートし、次にposts
フィールドの値の昇順でソートするパイプライン ステージを作成します。
sort(orderBy(descending("age"), ascending("posts")))
スキップ
$skip
パイプライン ステージは、 ステージに渡される指定された数の ドキュメント をスキップし、残りのドキュメントを次のステージに渡します。
次の例では、最初の5
ドキュメントをスキップしています。
skip(5)
Limit
$limit
パイプライン ステージは、次のステージに渡されるドキュメントの数を制限します。
次の例では、ドキュメント数を10に制限しています。
limit(10)
ルックアップ
$lookup
パイプライン ステージは、別のコレクションとの左外部結合を実行して、結合されたコレクションのドキュメントをフィルタリングして処理します。
次の例では、 fromCollection
コレクションに対して左外部結合を実行し、 local
フィールドをfrom
フィールドに結合し、 joinedOutput
フィールドに出力します。
lookup("fromCollection", "local", "from", "joinedOutput")
グループ
$group
パイプライン ステージは、指定された式でドキュメントをグループ化し、個別のグループごとにドキュメントを次のステージに出力します。 グループは、グループ化する式を指定する_id
と、各グループごとに評価される 0 個以上のアキュムレータで構成されます。
アキュムレータの式を簡素化するために、ドライバーにはサポートされている各アキュムレータのファクトリー メソッドを持つAccumulators
単一のオブジェクトが含まれています。
次の例では、ドキュメントをcustomerId
フィールドの値でグループ化し、各グループの数量フィールドの値の合計と平均をそれぞれtotalQuantity
フィールドとaverageQuantity
フィールドに累積します。
group("$customerId", sum("totalQuantity", "$quantity"), avg("averageQuantity", "$quantity"))
Unwind
$unwind
パイプライン ステージでは、入力ドキュメントから配列フィールドを分解して、 各 要素のドキュメントを出力します。
次の例では、各ドキュメントについて、 sizes
配列にある要素ごとのドキュメントを出力します。
unwind("$sizes")
次の例には、 sizes
フィールドの欠落値または null 値があるドキュメント、またはsizes
リストが空であるドキュメントも含まれます。
unwind("$sizes", UnwindOptions().preserveNullAndEmptyArrays(true))
次の例では、 sizes
配列を展開し、配列インデックスをposition
フィールドに出力します。
unwind("$sizes", UnwindOptions().includeArrayIndex("$position"))
ウィンドウ フィールドを設定
$setWindowFields
パイプライン ステージでは、ウィンドウ演算子を使用できます。 このステージでは、$group
パイプライン ステージと同様に入力ドキュメントを分割し、オプションでソートし、関数ごとに指定されたWindowsを計算することでドキュメント内のフィールドを計算し、ドキュメントを出力します。 ウィンドウは、パーティションのサブセットです。
$group
パイプライン ステージとの重要な違いは、同じパーティションまたはウィンドウに属するドキュメントが単一のドキュメントに分割されないことです。
ドライバーには、サポートされている ウィンドウ演算子のファクトリー メソッドを持つWindowedComputations
単一のオブジェクトが含まれています。
次の例では、 フィールドと フィールドに表示されるより詳細な測定値から、各地域ごとの過去 1 か月の累計の降量と平均温度を計算します。rainfall
temperature
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)))
パイプラインのアセンブル
パイプライン演算子は通常、リストに結合され、 MongoCollection
のaggregate()
メソッドに渡されます。
collection.aggregate(List(filter(equal("author", "Dave")), group("$customerId", sum("totalQuantity", "$quantity"), avg("averageQuantity", "$quantity")), out("authors")))