MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Как да нормализирам/намаля данните за времето в mongoDB?

Ето как бихте могли да го направите в рамка за агрегиране. Използвам малко опростяване - групирам само по година, месец и дата - във вашия случай ще трябва да добавите час и минута за по-фините изчисления. Освен това имате избор дали да направите претеглена средна стойност, ако разпределението на точките не е равномерно в извадката от данни, която получавате.

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

Пуснах това с някои произволни примерни данни и получих нещо от този формат:

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

Както можете да видите, това е един резултат за array_serial, име на порт, комбинация година/месец/дата. Можете да използвате $sort, за да ги поставите в реда, в който искате да ги обработите оттам.

Ето как бихте разширили стъпката на проекта, за да включите час и минута, като същевременно закръгляте минути до средна стойност за всеки пет минути:

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

Надяваме се, че ще можете да разширите това до вашите конкретни данни и изисквания.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Не може да накара пакета Accounts-Base да сочи към правилната база данни

  2. Как създавате връзки за Mongoid в Ruby on Rails?

  3. проблеми с php7 mongo заявка findOne

  4. Създайте клъстер от база данни в облака с MongoDB Atlas

  5. Използване на mongodb map/reduce в php