集計と演算子に関する考慮事項
集計段階や演算子の中には、 時系列コレクションで使用する場合に特別な考慮が必要なものがあります。
$geonear
時系列コレクションは、2dsphere インデックスに対するクエリからの 地理空間データをソートするための $geoNear
集計ステージのみをサポートします。$near
および $nearSphere
演算子は時系列コレクションでは使用できません。
$merge
$merge
集計ステージを使用して、別のコレクションのデータを時系列コレクションに追加することはできません。
$out
MongoDB 7.0 以降では、$out
集計ステージを使用して時系列コレクションにドキュメントを書き込み (write) できます。詳細については、「時系列コレクションへのデータの移行」を参照してください。
頻繁に使用される操作
時系列データを分析するには、次の集計パイプライン演算子とステージがよく使用されます。
$dateAdd
: Date オブジェクトに指定した時間を追加します。$dateDiff
: 2 つの日付の時差を返します。$dateTrunc
: 特定の単位で切り捨てられた日付を返します。$setWindowFields
: 指定されたウィンドウ内の文書に対して計算を実行します。
例
1 か月あたりの平均価格の計算
以下の構造を持つドキュメントを含む dowJonesTickerData
コレクションについて考えてみましょう。
{ date: ISODate("2020-01-03T05:00:00.000Z"), symbol: 'AAPL', volume: 146322800, open: 74.287498, adjClose: 73.486023, high: 75.144997, low: 74.125, close: 74.357498 }
この集計パイプラインは、次のアクションを実行します。
$dateTrunc
を使用して、各ドキュメントのdate
を適切な月に切り捨てます。$group
を使用して、ドキュメントを月と記号ごとにグループ化します。$avg
を使用して、月あたりの平均価格を計算します。
db.dowJonesTickerData.aggregate( [ { $group: { _id: { firstDayOfMonth: { $dateTrunc: { date: "$date", unit: "month" } }, symbol: "$symbol" }, avgMonthClose: { $avg: "$close" } } } ] )
パイプラインは一連のドキュメントを返し、各ドキュメントには特定の株式の 1 か月あたりの平均終値が記載されています。
{ _id: { firstDayOfMonth: ISODate("2020-06-01T00:00:00.000Z"), symbol: 'GOOG' }, avgMonthClose: 1431.0477184545455 }, { _id: { firstDayOfMonth: ISODate("2021-07-01T00:00:00.000Z"), symbol: 'MDB' }, avgMonthClose: 352.7314293333333 }, { _id: { firstDayOfMonth: ISODate("2021-06-01T00:00:00.000Z"), symbol: 'MSFT' }, avgMonthClose: 259.01818086363636 }
30日間のローリング平均を計算する
以下の構造を持つドキュメントを含む dowJonesTickerData
コレクションについて考えてみましょう。
{ date: ISODate("2020-01-03T05:00:00.000Z"), symbol: 'AAPL', volume: 146322800, open: 74.287498, adjClose: 73.486023, high: 75.144997, low: 74.125, close: 74.357498 }
この集計パイプラインは、次の操作を実行します。
$setWindowFields
を使用して 30 日間のウィンドウを指定する。各銘柄の過去 30 日間の終値のローリング平均を計算する。
db.dowJonesTickerData.aggregate( [ { $setWindowFields: { partitionBy: { symbol : "$symbol" } , sortBy: { date: 1 }, output: { averageMonthClosingPrice: { $avg : "$close", window : { range : [-1, "current"], unit : "month" } } } } } ] )
パイプラインは一連のドキュメントを返します。各ドキュメントには、その銘柄の前月の終値の平均を含む $averageMonthClosingPrice
フィールドが含まれています。
{ date: ISODate("2020-01-29T05:00:00.000Z"), symbol: 'AAPL', volume: 216229200, adjClose: 80.014801, low: 80.345001, high: 81.962502, open: 81.112503, close: 81.084999, averageMonthClosingPrice: 77.63137520000001 }