Hey Leute, ich bin wirklich neu, wenn es um Aggregation geht, bitte helft mir dabei.MongoDB Aggregation AVG()
Lassen Sie uns sagen, dass ich mehrere Dokumente haben (über die Zeit) wie folgt aus:
{
"_id": ObjectId("574d6175da461e77030041b7"),
"hostname": "VPS",
"timestamp": NumberLong(1460040691),
"cpuCores": NumberLong(2),
"cpuList": [
{
"name": "cpu1",
"load": 3.4
},
{
"name": "cpu2",
"load": 0.7
}
]
},
{
"_id": ObjectId("574d6175da461e77030041b7"),
"hostname": "VPS",
"timestamp": NumberLong(1460040700),
"cpuCores": NumberLong(2),
"cpuList": [
{
"name": "cpu1",
"load": 0.4
},
{
"name": "cpu2",
"load": 6.7
}
]
},
{
"_id": ObjectId("574d6175da461e77030041b7"),
"hostname": "VPS",
"timestamp": NumberLong(1460041000),
"cpuCores": NumberLong(2),
"cpuList": [
{
"name": "cpu1",
"load": 25.4
},
{
"name": "cpu2",
"load": 1.7
}
]
}
Ich mag würde die durchschnittliche CPU-Auslastung über X Zeit bekommen. Wobei X gleich 300 Sekunden ist.
So mit dem obigen Beispiel würde man ein Resultset erhalten, die wie folgt aussieht:
{
"avgCPULoad": "2.8",
"timestamp": NumberLong(1460040700)
},
{
"avgCPULoad": "13.55",
"timestamp": NumberLong(1460041000)
}
avgCpuLoad wird wie folgt berechnet:
- greifen alle Dokumente innerhalb von 300 Sekunden von eachother
- berechnen Durchschnitt:
(((3.4+0.7)/2)+((0.4+6.7)/2))/2 = 2.8
((25.4+1.7)/2) = 13.55
- hinzufügen Letzten Zeitstempel aus den ausgewählten Dokumenten.
Ich weiß, wie ich jedes Dokument für jede x Zeit bekomme. Das ist so gemacht:
db.Pizza.aggregate(
[
{
$group:
{
_id:
{
$subtract: [
'$timestamp',
{
$mod: ['$timestamp', 300]
}
]
},
'timestamp': {$last:'$timestamp'}
},
{
$project: {_id: 0, timestamp:'$timestamp'}
}
])
Aber wie würde man die Durchschnittswerte wie oben berechnet bekommen? Ich habe ein wenig mit $unwind
versucht, aber nicht die Ergebnisse, die ich gerne ..
Betrachten Sie Ihr Schema aufgeteilt bekommen abgeleiteter Wechsel haben eingebettete Dokumente mit konsistenten Schlüssel-Wert-Dokumenten für Ihr '" cpuList "' Feld zB '" cpuList ": [{name:" cpu1 ", laden: 3.4}, {name:" cpu2 ", laden: 0.7}]'. Sie müssen auch die "load" -Werte in numerische umwandeln, damit die Aggregations-Akkumulator-Operatoren wie '$ avg' effektiv sein können. – chridam
Der Grund, warum ich meine Load-Eigenschaften-Strings erstellt habe, war, dass, wann immer ich es zu einem numerischen Wert mache, ich mit dem Präzisions-Float ein Chaos bekommen würde. Zum Beispiel wurde in PHP ein float um 2 Dezimalstellen gerundet. Wann immer ich es in Mongo setzte, bekam es statt 2 Dezimalzahlen wie 10 mehr oder etwas mit einem wirklich kleinen Offset – Baklap4
@chridam Okay, ich habe mein Schema auf das geändert, was Sie vorgeschlagen haben. Wie würde man die Abfrage machen, um den Durchschnitt zu berechnen? – Baklap4