2011-06-12 113 views
6

我有一個MongoDB集合,需要在所有文檔中找到某個字段的max()值。此值是時間戳,我需要通過查找最大時間戳找到最新的文檔。對它進行排序並獲得第一個效率非常低。我應該分別維護一個'maxval',並在文檔到達時對其進行更新,並且該字段的值較大?有更好的建議嗎? 非常感謝。Mongo沒有max()函數,我該如何解決這個問題?

回答

3

當然,如果它將是大集合,並且您需要始終顯示最大時間戳,您可能需要在那裏創建單獨的集合並存儲統計數據,而不是每次訂購大集合。

statistic 
{ 
    _id = 1, 
    id_from_time_stamp_collection = 'xxx', 
    max_timestamp: value 
} 

而每當新的文檔來只更新ID = 1的統計收集(與查詢$ GT的條件,因此,如果新的時間戳會比max_timestamp然後max_timestamp將被更新更大,否則 - 無)。

也可能你可以存儲和更新統計信息收集中的其他統計數據。

+0

安德魯,是的,集合會變得非常快 - 想象它們是日誌記錄(不完全相同但是相同的想法) - 並且它們在一天左右進入數十萬行。我不必顯示max_ts就可以使用它來查找給定密鑰的最後保存記錄,該記錄具有基於客戶訪問網站保存的一系列記錄。所以你的建議就是我想的。 – Nitin 2011-06-13 22:33:49

-3

嘗試用db.collection.group

例如,與此集合:

> db.foo.find() 
{ "_id" : ObjectId("..."), "a" : 1 } 
{ "_id" : ObjectId("..."), "a" : 200 } 
{ "_id" : ObjectId("..."), "a" : 230 } 
{ "_id" : ObjectId("..."), "a" : -2230 } 
{ "_id" : ObjectId("..."), "a" : 5230 } 
{ "_id" : ObjectId("..."), "a" : 530 } 
{ "_id" : ObjectId("..."), "a" : 1530 } 

您可以使用group使用

> db.foo.group({ 
    initial: { }, 
    reduce: function(doc, acc) { 
     if(acc.hasOwnProperty('max')) { 
      if(acc.max < doc.a) 
       acc.max = doc.a; 
     } else { 
      acc.max = doc.a 
     } 
     } 
    }) 
[ { "max" : 5230 } ] 

由於在group根本沒有key值對象被分組在單個結果中

+0

這種方法太慢了。其他缺點是該小組不能在分片環境中工作 – Daimon 2011-06-13 10:02:44

18

,如果你對timestsamp的一個索引,找到的最高值是efficientl像

db.things.find().sort({ts:-1}).limit(1) 

,但如果具有一定的折射率是太多的開銷存儲在一個單獨的集合,最大可能是很好的。

+0

@dm是的,我確實有一個關於ts的索引,這正是我正在做的。然而,對於每個在相對較高流量的網站上訪問的網站來說,這必須發生,因此它必須具有與通過密鑰查找幾乎相同的成本。否則,當交通發生突發事件時,速度會變得很快。 – Nitin 2011-06-13 22:30:28

+0

我認爲這會返回一個遊標。 sort({ts:-1})。limit(1)[0]你可能會更好的添加一個索引到最後:db.things.find – sage88 2013-10-14 04:41:38

相關問題