sql >> Database >  >> NoSQL >> MongoDB

Hoe tijdgegevens in mongoDB te normaliseren / verminderen?

Hier leest u hoe u het in een aggregatiekader zou kunnen doen. Ik gebruik een kleine vereenvoudiging - ik groepeer alleen op jaar, maand en datum - in jouw geval moet je uren en minuten toevoegen voor de fijnere berekeningen. U kunt ook kiezen of u een gewogen gemiddelde wilt doen als de puntenverdeling niet uniform is in de gegevenssteekproef die u krijgt.

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

Ik heb dit uitgevoerd met wat willekeurige voorbeeldgegevens en kreeg iets van dit formaat:

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

Zoals je kunt zien is dit één resultaat per array_serial, poortnaam, jaar/maand/datum combinatie. Je kunt $sort gebruiken om ze in de volgorde te krijgen waarin je ze wilt verwerken.

Hier ziet u hoe u de projectstap zou uitbreiden met uren en minuten, terwijl u de minuten afrondt naar het gemiddelde over elke vijf minuten:

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

Ik hoop dat u dat kunt uitbreiden naar uw specifieke gegevens en vereisten.



  1. MongoDB C#-stuurprogramma, query door een array-element met regex

  2. Hoe Heroku Redis wissen?

  3. Rails Mongoid kan niet verifiëren - mislukt met fout 13:niet geautoriseerd voor query op my_db.my_collection

  4. findAndModify mislukt met fout:Kan 'field1' en 'field1' niet tegelijkertijd bijwerken