sql >> データベース >  >> NoSQL >> MongoDB

時系列と集計フレームワーク(mongo)

    エラーは、_idの計算方法です。 $groupの場合 演算子、具体的にはそのsecond パート:

    second: { $subtract: [
        { $second: "$time" },
        { $mod: [
            { $second: "$time" },
            timeBlock / 1000
        ]}
    ]}
    

    したがって、すべてのデータを10個のtimeBlockに分割する代わりに new Date(end - 10 * timeBlock)から始まるミリ秒の長さのチャンク 、timeBlockの最も近い除数から開始して11個のチャンクに分割します 。

    これを修正するには、最初にdelta = end - $timeを計算する必要があります その後、元の$timeの代わりに使用します _idを作成するには 。

    これが私の言いたいことの例です:

    Document.aggregate({
        $match: {
            time: {
                $gte: new Date(end - 10 * timeBlock),
                $lt: new Date(end)
            }
        }
    }, {
        $project: {
            time: 1,
            delta: { $subtract: [
                new Date(end),
                "$time"
            ]}
        }
    }, {
        $project: {
            time: 1,
            delta: { $subtract: [
                "$delta",
                { $mod: [
                    "$delta",
                    timeBlock
                ]}
            ]}
        }
    }, {
        $group: {
            _id: { $subtract: [
                new Date(end),
                "$delta"
            ]},
            count: { $sum: 1 }
        }
    }, {
        $project: {
            time: "$_id",
            count: 1,
            _id: 0
        }
    }, {
        $sort: {
            time: 1
        }
    }, function(err, result) {
        // ...
    })
    

    また、生の時間値(ミリ秒単位)を使用することをお勧めします。これは、はるかに簡単で、間違いを防ぐことができるためです。 timeをキャストできます timeParts$groupの後 $projectを使用する オペレーター。




    1. redisクライアントからLuaスクリプトを実行中にエラーが発生しました

    2. MongoDB:コレクションを手動でロックおよびロック解除します

    3. FlaskとMongoEngineでTumblelogアプリケーションをフォローしているときにエラーが発生しました

    4. Spring DataMongoDBのMongoDBObjectIdからタイムスタンプをどのように抽出しますか?