文档菜单
文档首页
/
MongoDB 手册
/ /

聚合与操作符注意事项

本页内容

  • $geonear
  • $merge
  • $out
  • 常用操作
  • 示例
  • 计算每月平均价格
  • 计算30天滚动平均

在使用时间序列集合时,某些聚合阶段和操作符需要特殊考虑时间序列集合.

时间序列集合仅支持使用.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 聚合阶段将另一个集合中的数据添加到时间序列集合中。

从 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
}

考虑一个包含以下结构的 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
}

返回

查询