0

我正在尝试在 Mongo 数据库中构建一个时间序列,并根据几个 SO 帖子的建议,为每个事件准备一个文档,例如:

{
  _id: ObjectId("51a67033868eda7666b0a49c"),
  station_id: 12,
  timestamp: ISODate("2013-05-29T21:16:35.929Z"),
  value: 50
}

获取特定电台的历史很容易(db.mydata.find({station_id: 12}, {timestamp: 1}))。

更大的挑战是在我所有的站点中获取最新的价值。(请注意,每个站的最新时间戳都会不同,所以我不能做一个简单的查询。)在 SQL 中,我会这样做:

SELECT station_id, timestamp, value
FROM mydata
WHERE (station_id, timestamp) IN (
  SELECT station_id, MAX(timestamp)
  FROM mydata
  GROUP BY station_id
)

你会如何在 Mongodb 中做类似的事情?聚合框架非常强大,但我想不出使用它进行此类分析的方法。

非常感谢您的帮助。

4

2 回答 2

2

您可以使用聚合框架,但它有点棘手。方法如下:

db.mydata.aggregate( [
      { $sort : {timestamp:-1}},
      { $group : { _id : "$station_id",
                 timestamp : {$first:"$timestamp"},
                 value : {$first:"$value"}
      }  }
] )

基本上,您是按时间戳降序对输入进行排序 - 然后聚合并为每个唯一的 station_id 保留遇到的第一个时间戳和值(按排序顺序!)

于 2013-06-01T07:30:28.607 回答
0
SELECT station_id, timestamp, value
FROM mydata
WHERE (station_id, timestamp) IN (
  SELECT station_id, MAX(timestamp)
  FROM mydata
  GROUP BY station_id
)

我认为会类似于

db.aggregate( 
    { $group : { _id : "$station_id", max_timestamp : { $max : timestamp } } },
    { $project : {station_id : 1, max_timestamp : 1, value : 1 } }
)
于 2013-05-31T21:56:36.197 回答