2014-09-25 35 views
1

比方說,我有以下的MongoDB文檔。哪個更快,MogoDB聚合還是自我實現「For」循環?

{ 
(...) 
"services": { 
    "TCP80": { 
     "data": [{ 
      "status": 1, 
      "delay": 3.87, 
      "ts": 1308056460 
     },{ 
      "status": 1, 
      "delay": 2.83, 
      "ts": 1308058080 
     },{ 
      "status": 1, 
      "delay": 5.77, 
      "ts": 1308060720 
     }] 
    } 
}} 

我要檢索的「數據」數組,其「TS」值大於「1308056460」更大的所有條目。因此,預期的結果是,

[ 
     { 
      "status": 1, 
      "delay": 2.83, 
      "ts": 1308058080 
     },{ 
      "status": 1, 
      "delay": 5.77, 
      "ts": 1308060720 
     } 
] 

一種方法可以使用MongoDB聚合函數。

db.test.aggregate(
    {$match : {}}, 
    {$unwind: "$services.TCP80.data"}, 
    {$match: {"services.TCP80.data.ts": {$gte: 1308060720}}} 
); 

其他將檢索由中間層(一個的node.js應用程序)的整個數據陣列和運行一個循環以濾除我想要的值。

撇開實施簡單性,哪種方法會更有效率或產生更快的結果?爲什麼?

+2

這實際上是相當主觀的,這裏的一般提示是「哪個最好」並不是真正的問題前提。現實傾向於指出,您的「數據庫」平臺「應該」比您的「應用程序」平臺具有更強的處理能力。更不用說,你在兩者之間傳輸不必要的數據。試圖在這裏決定是否真的有一個真正的問題。因爲如果你沒有「期待」數據庫去做,那麼爲什麼要使用數據庫呢? – 2014-09-25 11:03:42

回答

3

一般來說,MongoDB Aggregate函數預計會更快,因爲它是用C語言實現的,並且經過高度優化,並且不斷髮展,以便更快。儘管如此,就像Neil提到的那樣,除非你正在構建關鍵任務,否則良好的軟件工程實踐應該優先考慮。預計數據庫將完成所有繁重的工作,並避免不必要的數據傳輸。代碼的複雜性和抽象性也應考慮在內。在這種情況下,由於MongoDb確實提供了一個查詢來複制數據庫本身的邏輯,你應該在數據庫服務器上執行它。

相關問題