2013-04-15 69 views
0

我的應用程序在MongoDB集合中記錄了一些數據。有三種類型的事件:'event1','event2','event3'。這些元素會定期添加。 事件結構例如:在MongoDB中選擇最新文檔

{ 'Data' : 'a234235', 'Type' : 'event1', 'Timestamp' : 1366006599 } 
{ 'Data' : 'b978543', 'Type' : 'event2', 'Timestamp' : 1366006600 } 
{ 'Data' : 'c567921', 'Type' : 'event3', 'Timestamp' : 1366006601 } 
{ 'Data' : 'd327863', 'Type' : 'event1', 'Timestamp' : 1366007100 } 
{ 'Data' : 'e', 'Type' : 'event2', 'Timestamp' : 1366007102 } 
{ 'Data' : 'f834721', 'Type' : 'event3', 'Timestamp' : 1366007103 } 

請幫助編寫正確的查詢數據庫獲取每個事件的當前狀態。我需要三種不同類型和最大時間戳的元素。

+0

你可以隨時啓動三個獨立的簡單查詢:) –

+0

Аnd如果我有200種類型的事件,該怎麼辦? :)不幸的是,這不是最好的解決方案。 – msmirnov

+0

你只需要每個事件類型的最後一個文檔的數據? – sambomartin

回答

0

您將需要爲每個事件單獨查詢。

db.yourCollection.find({Type:"event1"}).sort({Timestamp:-1}).limit(1);  
db.yourCollection.find({Type:"event2"}).sort({Timestamp:-1}).limit(1);  
db.yourCollection.find({Type:"event3"}).sort({Timestamp:-1}).limit(1); 

注意,在時間戳字段創建索引可能會提高性能提升不少。

參見:http://docs.MongoDB.org/manual/reference/method/cursor.sort/

+0

還有其他解決方案嗎?我想在一個函數中完成它。 – msmirnov

0

因爲你可能有〜200個事件(如關於該問題的評論中指出),我會建議最有效的方法是創建記錄最近發生的事件的總結文件(按類型)。這避免了需要做單獨的查詢,並且應該易於使用$set作爲新的事件類型被觀察。

摘要文檔看起來像:

{ 
    'Event1' : { 'Data' : 'd327863', 'Timestamp' : 1366007100 }, 
    'Event2' : { 'Data' : 'e', 'Timestamp' : 1366007102 }, 
    'Event3' : { 'Data' : 'f834721', 'Timestamp' : 1366007103 } 
} 

pre-aggregated report模式將避免多個查詢的需要,如果你經常需要找到類型最大的事件,並節省(可能很大)空間的索引號爲Timestamp,否則需要查找最新的條目。

0

您可以使用以下JavaScript來完成您的工作。這裏的缺點是我假設你的事件是不變的,否則你需要在「Type」數組字段中改變它。

您可以在連接到數據庫時調用它。

a=function() 
{ 
    var Type = new Array(); 
    Type[0]="event1"; 
    Type[1]="event2"; 
    Type[2]="event3"; 
    Type[3]="event4"; 
    Type[4]="event5"; 

    for (i=0;i<Type.length;i++) 
    { 

     var myCursor = db.foo.find({Type:Type[i]}).sort({Timestamp:-1}).limit(1); 
     myCursor.forEach(printjson); 
    } 
} 

這是我爲我的測試案例得到的輸出。

MongoDB shell version: 2.2.2 
connecting to: test 

{ 
    "_id" : ObjectId("516bc991cde2925693705103"), 
    "Data" : "d327863", 
    "Type" : "event1", 
    "Timestamp" : 1366007100 
} 
{ 
    "_id" : ObjectId("516bc991cde2925693705104"), 
    "Data" : "e", 
    "Type" : "event2", 
    "Timestamp" : 1366007102 
} 
{ 
    "_id" : ObjectId("516bc992cde2925693705105"), 
    "Data" : "f834721", 
    "Type" : "event3", 
    "Timestamp" : 1366007103 
} 
bye 

另請注意,默認情況下,它連接到測試數據庫。對類型和時間戳索引將有助於您的表現。