2015-11-24 46 views
0

以下是db中文檔的樣子。MongoDB - 如何進行查詢以獲得平均使用率?

/* 1 */ 
{ 
    "_id" : 1, 
    "feat" : { 
     "processName": [ 
     { 
      "value" : { 
       "value": "Process1" 
      } 
     } 
     ], 
     "processUsage": [ 
     { 
      "value" : { 
       "value": 23.21 
      } 
     } 
     ] 
    } 
} 

/* 2 */ 
{ 
    "_id" : 2, 
    "feat" : { 
     "processName": [ 
     { 
      "value" : { 
       "value": "Process2" 
      } 
     } 
     ], 
     "memoryUsage": [ 
     { 
      "value" : { 
       "value": 2.411502e+05 
      } 
     } 
     ] 
    } 
} 

/* 3 */ 
{ 
    "_id" : 3, 
    "feat" : { 
     "processName": [ 
     { 
      "value" : { 
       "value": "Process1" 
      } 
     } 
     ], 
     "processUsage": [ 
     { 
      "value" : { 
       "value": 67.42 
      } 
     } 
     ] 
    } 
} 

/* 4 */ 
{ 
    "_id" : 4, 
    "feat" : { 
     "processName": [ 
     { 
      "value" : { 
       "value": "Process3" 
      } 
     } 
     ], 
     "processUsage": [ 
     { 
      "value" : { 
       "value": 39.97 
      } 
     } 
     ] 
    } 
} 

/* 5 */ 
{ 
    "_id" : 5, 
    "feat" : { 
     "processName": [ 
     { 
      "value" : { 
       "value": "Process2" 
      } 
     } 
     ], 
     "processUsage": [ 
     { 
      "value" : { 
       "value": 21.05 
      } 
     } 
     ] 
    } 
} 

每個進程都包含具有processUsage和memoryUsage的條目。我感興趣的是平均processUsage。所以,我想用memoryUsage忽略這些條目。

我在$ avg的合計中嘗試了$ match + $組,但對於每個過程,我只是以平均值0.00000000返回。 然後我試着用mapReduce使用javascript,我很幸運,不幸的是它也沒有成功。

有人能告訴我該怎麼做嗎?順便說一句,我使用Robomongo 0.8.5

編輯:

查詢看起來是這樣的:

db.database.aggregate([ 
    { $match : {"$feat.processUsage.value.value": {$gt : -1} 
    }, 
    { 
     $group: {_id: "$feats.processName.value.value", average: {$avg: 
      "$feats.processUsage.value.value"} 
    } 
]) 
+0

你能證明你試一下查詢? – toddmo

+0

@toddmo:我添加了查詢。 – tumbler

+0

你在錯誤的基礎上分組。你需要一個標識符來區分內存和進程。然後按它分組。 –

回答

1

您可以使用下面的彙總查詢:

db.test.aggregate(
    [ 
    { 
     $unwind : "$feat.processUsage" 
    }, 
    { 
     $group: { 
     _id: "$feat.processName.value.value", 
     average: {$avg:"$feat.processUsage.value.value"} 
     } 
    } 
    ] 
) 

開卷在初始階段會讓你過濾文件中有processUsage鍵的文件。

結果:

{ "_id" : [ "Process2" ], "average" : 21.05 } 
{ "_id" : [ "Process3" ], "average" : 39.97 } 
{ "_id" : [ "Process1" ], "average" : 45.315 } 
+0

謝謝。這對我有效。你能否偶然告訴我,如何計算robomongo的標準偏差呢? – tumbler

+0

聚合的標準偏差在mongoDB 3.1.5中可用。看看這個:https://jira.mongodb.org/browse/SERVER-5044。作爲一項解決方案,您需要按照https://gist.github.com/RedBeard0531/1886960中所述在當前穩定版本中執行map reduce –