Mongodb:从时间序列中选择最后一个事件

时间:2013-05-31 20:54:30

标签: mongodb aggregation-framework

我正在尝试在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做类似的事情?聚合框架非常强大,但我无法找到使用它进行此类分析的方法。

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分: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 } }
)