sql >> Database >  >> NoSQL >> MongoDB

Mongodb-aggregatie per dag op basis van Unix-tijdstempel

MongoDB 4.0 en nieuwer

Gebruik $toDate

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

of $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 en <4.0:

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

U moet de LASTLOGIN . converteren veld naar een milliseconde tijdstempel door de waarde te vermenigvuldigen met 1000

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

, zet dan om in een datum

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

en dit kan gedaan worden in de $project pijplijn door uw milliseconden tijd toe te voegen aan een Date(0) van nul milliseconden object en extraheer $year , $month , $dayOfMonth delen van de geconverteerde datum die u vervolgens kunt gebruiken in uw $group pijplijn om de documenten per dag te groeperen.

U moet uw aggregatiepijplijn dus als volgt wijzigen:

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 }
    }
};

De aggregatiepijplijn uitvoeren:

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

zou de volgende resultaten opleveren (op basis van het voorbeelddocument):

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

Een verbetering zou zijn om het bovenstaande in een enkele pijplijn uit te voeren als

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 }
    }
};

De aggregatiepijplijn uitvoeren:

db.session_log.aggregate([ group ])


  1. MongoDB:Tellen hoeveel items met een bepaalde waarde er in een array zijn, dat is in een document?

  2. Het gebruik van findOne in een lus duurt te lang in Node.js

  3. Memcached gebruiken met Yii2 Framework

  4. ServiceStack.Redis:kan geen verbinding maken:sPort:50071