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