2013-05-31 43 views
0

我試圖建立一個蒙戈數據庫中的時間序列從幾個SO帖子的最後一個事件,並根據建議,正在與一個文件去爲每一個事件,如:的MongoDB:選擇從時間序列

{ 
    _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

可以使用聚合框架,但它是一個有點棘手。這裏是如何:

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

基本上你是排序按時間戳降序你的輸入 - 然後你彙總併爲每個獨特的station_id你保持第一時間戳和價值,你遇到

+0

謝謝!那很完美 – Maan

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 } } 
) 
+1

贏得(按排序順序!)沒有用 - 你只有station_id和timestamp出現在$ group階段。你無法保存它,因此無法投射價值。 –

+0

你說得對。我想我可能會因爲處於不同的聚合級別而失去某些東西,但我沒有考慮解決方案。我認爲這是唯一的方法,+1。 –