MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Wie werden Zeitdaten in MongoDB normalisiert/reduziert?

So können Sie dies im Aggregation Framework tun. Ich verwende eine kleine Vereinfachung - ich gruppiere nur nach Jahr, Monat und Datum - in Ihrem Fall müssen Sie Stunde und Minute für die feineren Berechnungen hinzufügen. Sie haben auch die Wahl, ob Sie einen gewichteten Durchschnitt berechnen möchten, wenn die Punkteverteilung in der erhaltenen Datenstichprobe nicht einheitlich ist.

project={"$project" : {
        "year" : {
            "$year" : "$DateTime"
        },
        "month" : {
            "$month" : "$DateTime"
        },
        "day" : {
            "$dayOfWeek" : "$DateTime"
        },
        "array_serial" : 1,
        "Port Name" : 1,
        "metric" : 1
    }
};
group={"$group" : {
        "_id" : {
            "a" : "$array_serial",
            "P" : "$Port Name",
            "y" : "$year",
            "m" : "$month",
                    "d" : "$day"
        },
        "avgMetric" : {
            "$avg" : "$metric"
        }
    }
};

db.metrics.aggregate([project, group]).result

Ich habe dies mit einigen zufälligen Beispieldaten ausgeführt und etwas in diesem Format erhalten:

[
    {
        "_id" : {
            "a" : "12345",
            "P" : "CL1-B",
            "y" : 2012,
            "m" : 9,
            "d" : 6
        },
        "avgMetric" : 100.8
    },
    {
        "_id" : {
            "a" : "12345",
            "P" : "CL1-B",
            "y" : 2012,
            "m" : 9,
            "d" : 7
        },
        "avgMetric" : 98
    },
    {
        "_id" : {
            "a" : "12345",
            "P" : "CL1-A",
            "y" : 2012,
            "m" : 9,
            "d" : 6
        },
        "avgMetric" : 105
    }
]

Wie Sie sehen können, ist dies ein Ergebnis pro array_serial, Portname, Jahr/Monat/Datum-Kombination. Sie können $sort verwenden, um sie in die Reihenfolge zu bringen, in der Sie sie von dort aus verarbeiten möchten.

So würden Sie den Projektschritt erweitern, um Stunde und Minute einzubeziehen, während die Minuten auf den Durchschnitt über alle fünf Minuten gerundet werden:

{
    "$project" : {
        "year" : {
            "$year" : "$DateTime"
        },
        "month" : {
            "$month" : "$DateTime"
        },
        "day" : {
            "$dayOfWeek" : "$DateTime"
        },
        "hour" : {
            "$hour" : "$DateTime"
        },
        "fmin" : {
            "$subtract" : [
                {
                    "$minute" : "$DateTime"
                },
                {
                    "$mod" : [
                        {
                            "$minute" : "$DateTime"
                        },
                        5
                    ]
                }
            ]
        },
        "array_serial" : 1,
        "Port Name" : 1,
        "metric" : 1
    }
}

Ich hoffe, Sie können das auf Ihre spezifischen Daten und Anforderungen erweitern.