sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur man normaliserar/minskar tidsdata i mongoDB?

Så här kan du göra det i aggregeringsramverk. Jag använder en liten förenkling - jag grupperar bara på år, månad och datum - i ditt fall måste du lägga till timme och minut för de finare beräkningarna. Du kan också välja om du vill göra ett viktat medelvärde om poängfördelningen inte är enhetlig i det dataurval du får.

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

Jag körde detta med några slumpmässiga exempeldata och fick något av detta format:

[
    {
        "_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
    }
]

Som du kan se är detta ett resultat per kombination av array_serial, portnamn, år/månad/datum. Du kan använda $sort för att få dem i den ordning du vill bearbeta dem därifrån.

Så här skulle du utöka projektsteget till att inkludera timme och minut samtidigt som du avrundar minuter till genomsnitt över var femte minut:

{
    "$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
    }
}

Hoppas du kommer att kunna utöka det till dina specifika data och krav.



  1. hur man skapar mongoDB objectid i java

  2. Hur skapar jag en första mongodb-användare med auktorisering aktiverad?

  3. Mongodb unikt sparsamt index

  4. Meteor:Hur man skriver en publiceringsfunktion som innehåller användarnamnet