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、ポート名、年/月/日付の組み合わせごとに1つの結果です。 $ sortを使用して、そこから処理したい順序に並べ替えることができます。

    プロジェクトステップを拡張して時間と分を含め、分を5分ごとの平均に丸める方法は次のとおりです。

    {
        "$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. C#のMongoDB db.runCommand()

    2. マングースで提供された条件配列内のアイテムの順序でクエリ結果を並べ替える

    3. クラス「MongoClient」が見つかりません

    4. Ruby on RailsでMongoidの関係をどのようにシードしますか?