聚合和操作符注意事项
将某些聚合阶段和操作符与 时间序列集合一起使用时,需要特别注意。
$geoNear
时间序列集合仅支持 $geoNear
聚合阶段,用于对针对 2 dsphere 索引的查询中的地理空间数据进行排序。您不能对时间序列集合使用 $near
和 $nearSphere
操作符。
$merge
您不能使用 $merge
聚合阶段将另一个集合中的数据添加到时间序列集合中。
$out
从 MongoDB 7.0 开始,您可以使用 $out
聚合阶段将文档写入时间序列集合。有关更多信息,请参阅将数据迁移到时序集合。
常用操作
以下聚合管道操作符和阶段通常用于分析时间序列数据:
$dateAdd
:向数据对象添加指定的时间量。$dateDiff
: 返回两个日期之间的时间差。$dateTrunc
:返回已截断到特定单位的日期。$setWindowFields
:对给定窗口中的文档运行计算。
示例
计算每月平均价格
考虑包含具有以下结构的文档的 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" } } } ] )
该管道返回一组文档,其中每个文档包含特定股票的每月平均收盘价。
{ _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 }