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

UNIXタイムスタンプに基づく日ごとのMongodb集計

    MongoDB4.0以降

    $ toDateを使用します

    db.session_log.aggregate([
        { "$group": {
            "_id": {
                "$dateToString": {
                    "format": "%Y-%m-%d",
                    "date": {
                        "$toDate": { 
                            "$multiply": [1000, "$LASTLOGIN"]
                        }
                    }
                }
            },
            "count": { "$sum": 1 }
        } }
    ])
    

    または $ convert

    db.session_log.aggregate([
        { "$group": {
            "_id": {
                "$dateToString": {
                    "format": "%Y-%m-%d",
                    "date": {
                        "$convert": { 
                            "input":  { 
                                "$multiply": [1000, "$LASTLOGIN"] 
                            }, 
                            "to": "date"
                        }
                    }
                }
            },
            "count": { "$sum": 1 }
        } }
    ])
    

    MongoDB> =3.0および<4.0:

    db.session_log.aggregate([
        { "$group": {
            "_id": {
                "$dateToString": {
                    "format": "%Y-%m-%d",
                    "date": {
                        "$add": [
                            new Date(0), 
                            { "$multiply": [1000, "$LASTLOGIN"] }
                        ]
                    }
                }
            },
            "count": { "$sum": 1 }
        } }
    ])
    

    LASTLOGINを変換する必要があります 値に1000を掛けて、フィールドをミリ秒のタイムスタンプに変換します

    { "$multiply": [1000, "$LASTLOGIN"] }
    

    、次に日付に変換します

    "$add": [
        new Date(0),
        { "$multiply": [1000, "$LASTLOGIN"] }
    ]
    

    これは、 $ project ミリ秒の時間をゼロミリ秒に追加してパイプラインを作成しますDate(0) オブジェクトを抽出し、 $yearを抽出します $ month > $ dayOfMonth > $ group ドキュメントを日ごとにグループ化するパイプライン。

    したがって、集約パイプラインを次のように変更する必要があります。

    var project = {
        "$project":{ 
            "_id": 0,
            "y": {
                "$year": {
                    "$add": [
                        new Date(0),
                        { "$multiply": [1000, "$LASTLOGIN"] }
                    ]
                }
            },
            "m": {
                "$month": {
                    "$add": [
                        new Date(0),
                        { "$multiply": [1000, "$LASTLOGIN"] }
                    ]
                }
            }, 
            "d": {
                "$dayOfMonth": {
                    "$add": [
                        new Date(0),
                        { "$multiply": [1000, "$LASTLOGIN"] }
                    ]
                }
            }
        } 
    },
    group = {   
        "$group": { 
            "_id": { 
                "year": "$y", 
                "month": "$m", 
                "day": "$d"
            },  
            "count" : { "$sum" : 1 }
        }
    };
    

    集約パイプラインの実行:

    db.session_log.aggregate([ project, group ])
    

    次の結果が得られます(サンプルドキュメントに基づく):

    { "_id" : { "year" : 2014, "month" : 1, "day" : 3 }, "count" : 1 }
    

    改善は、上記を単一のパイプラインで実行することです

    var group = {   
        "$group": { 
            "_id": {    
                "year": {
                    "$year": {
                        "$add": [
                            new Date(0),
                            { "$multiply": [1000, "$LASTLOGIN"] }
                        ]
                    }
                },
                "mmonth": {
                    "$month": {
                        "$add": [
                            new Date(0),
                            { "$multiply": [1000, "$LASTLOGIN"] }
                        ]
                    }
                }, 
                "day": {
                    "$dayOfMonth": {
                        "$add": [
                            new Date(0),
                            { "$multiply": [1000, "$LASTLOGIN"] }
                        ]
                    }
                }
            },  
            "count" : { "$sum" : 1 }
        }
    };
    

    集約パイプラインの実行:

    db.session_log.aggregate([ group ])
    


    1. RailsアプリでHASHをRedisに保存する

    2. mongoDBコレクションから配列を取得するにはどうすればよいですか?

    3. MongoDBフィルターマルチサブドキュメント

    4. ドキュメントが更新されているか、MongoDBに挿入されているかを確認する方法