sql >> Database teknologi >  >> NoSQL >> MongoDB

Hvordan normalisere/reducere tidsdata i mongoDB?

Her er, hvordan du kan gøre det i aggregeringsramme. Jeg bruger en lille forenkling - jeg grupperer kun på år, måned og dato - i dit tilfælde skal du tilføje time og minut for de finere beregninger. Du har også et valg om, hvorvidt du vil lave vægtet gennemsnit, hvis pointfordelingen ikke er ensartet i den dataprøve, 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
 

Jeg kørte dette med nogle tilfældige prøvedata og fik noget af dette 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, er dette et resultat pr. kombination af array_serial, portnavn, år/måned/dato. Du kan bruge $sort til at få dem i den rækkefølge, du vil behandle dem derfra.

Sådan vil du udvide projekttrinnet til at omfatte time og minut, mens du afrunder minutter til gennemsnit over hvert 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
    }
}
 

Håber du vil være i stand til at udvide det til dine specifikke data og krav.



  1. Spring MongoTemplate - find af regex i samling

  2. Rails &Mongoid unikke resultater

  3. Opbygning af en skalerbar proces ved hjælp af NiFi, Kafka og HBase på CDP

  4. Chef Solo fejl:Kogebog apt ikke fundet