聚合与操作符注意事项
在使用时间序列集合时,某些聚合阶段和操作符需要特殊考虑时间序列集合.
使用
时间序列集合仅支持使用.leafygreen-ui-1l06pbn{font-size:15px;line-height:24px;display:inline;-webkit-transition:all 0.15s ease-in-out;transition:all 0.15s ease-in-out;border-radius:3px;font-family:'Source Code Pro',Menlo,monospace;line-height:20px;background-color:#F9FBFA;border:1px solid #E8EDEB;color:#1C2D38;white-space:nowrap;font-size:unset;display:inline;color:var(--font-color-primary);background:var(--background-color-secondary);}.lg-ui-0000:hover>.leafygreen-ui-1l06pbn{-webkit-text-decoration:none;text-decoration:none;}.lg-ui-0000:hover>.leafygreen-ui-1l06pbn{box-shadow:0 0 0 3px #E8EDEB;border:1px solid #C1C7C6;}.lg-ui-0000:focus-visible>.leafygreen-ui-1l06pbn{box-shadow:0 0 0 2px #FFFFFF,0 0 0 4px #0498EC;border:1px solid #016BF8;}a .leafygreen-ui-1l06pbn{color:inherit;}$geoNear
聚合阶段对空间数据进行排序,这是通过对2dsphere索引的查询实现的。您不能在时间序列集合上使用$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
将每个文档的日期
截断到合适的月份。使用
$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 }