2015-11-24 1 views
0

Voici à quoi ressemblent les documents dans db.MongoDB - Comment faire une requête pour obtenir l'utilisation moyenne?

/* 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 
      } 
     } 
     ] 
    } 
} 

Chaque processus a des entrées avec processUsage et memoryUsage. Ce qui m'intéresse, c'est l'utilisation moyenne du processus. Donc, je voudrais ignorer les entrées avec memoryUsage.

J'ai essayé $ match + $ groupe dans un agrégat avec $ moy, mais pour chaque processus, je viens de revenir en moyenne 0,00000000. Ensuite, j'ai tenté ma chance avec mapReduce en utilisant javascript, malheureusement cela n'a pas fonctionné non plus.

Quelqu'un pourrait-il me montrer comment faire? Soit dit en passant, je me sers Robomongo 0.8.5

Edit:

La requête ressemble à ceci:

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

Pouvez-vous montrer la requête que vous avez essayé? – toddmo

+0

@toddmo: J'ai ajouté la requête. – tumbler

+0

Vous vous regroupez sur la mauvaise base. Vous aurez besoin d'un identifiant qui distinguera la mémoire du processus. Puis groupe par là. –

Répondre

1

Vous pouvez utiliser la requête globale suivante:

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

déroulage dans la phase initiale vous permettra de filtrer les documents qui ont la clé processUsage dans le document.

Résultat:

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

Merci. Cela a fonctionné pour moi. Pourriez-vous me montrer par hasard, comment calculer l'écart-type dans robomongo, aussi? – tumbler

+0

l'écart type d'agrégation est disponible dans mongoDB 3.1.5. Vérifiez cela: https://jira.mongodb.org/browse/SERVER-5044. Comme un travail autour de vous devez faire réduire la carte dans la version stable actuelle comme décrit dans https://gist.github.com/RedBeard0531/1886960 –