Docs Menu
Docs Home
/ / /
Scala
/

集計

項目一覧

  • 一致
  • プロジェクト
  • 計算フィールド
  • サンプル
  • Sort
  • スキップ
  • Limit
  • ルックアップ
  • グループ
  • Unwind
  • ウィンドウ フィールドを設定
  • パイプラインのアセンブル

集計 クラスには、 集計パイプライン ステージ を構築する静的ファクトリー メソッドが用意されています。各メソッドは 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パイプライン ステージは、指定されたソート条件でソートされて、すべてのドキュメントを次のステージに渡します。 並べ替え条件は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と、各グループごとに評価される 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")))

戻る

ソート