Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs Menu
Docs Home
/ / /
Scala ドライバー
/

ビルダ クラスを集計する

The Aggregates class provides static factory methods that build aggregation pipeline stages. Each method returns an instance of the Bson type, which can in turn be passed to the MongoCollection.aggregate() method.

次のコードに示すように、 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パイプラインステージは、指定されたソート条件でソートされて、すべてのドキュメントを次のステージに渡します。Bson並べ替え条件は を実装するクラスのインスタンスにすることもできますが、 ソート ビルダクラスのメソッドのメソッドを使用すると便利です。

次の例では、 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と、各グループごとに評価される 0 個以上のアキュムレータで構成されます。

アキュムレータの式を簡素化するために、ドライバーにはサポートされている各アキュムレータのファクトリー メソッドを持つAccumulators単一のオブジェクトが含まれています。

次の例では、ドキュメントをcustomerId フィールドの値でグループ化し、各グループの数量フィールドの値の合計と平均をそれぞれtotalQuantity フィールドとaverageQuantity フィールドに累積します。

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単一のオブジェクトが含まれています。

次の例では、 フィールドと フィールドに表示されるより詳細な測定値から、各地域ごとの過去 1 か月の累計の降量と平均温度を計算します。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")))

戻る

ソート ビルダ クラス

項目一覧