MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Possible de comparer les chaînes de date dans mongodb ?

Si vous souhaitez sélectionner des enregistrements, utilisez une plage de dates :

db.collection.find({
    created: { "$gte": new Date("2013-05-27"), "$lt": new Date("2013-05-28") }
})

Et cela sélectionne toutes les heures, minutes, etc. contenues entre les deux dates.

Donc, vous devriez essayez d'utiliser les valeurs de date et de ne pas les contraindre dans des chaînes.

Si vous voulez cela pour faire de l'agrégation ou autrement besoin les résultats dans un format de jour uniquement, puis faites-le en utilisant $project et la date opérateurs :

db.collection.aggregate([
    // Still match on the normal date forms, this time whole month
    { "$match": {
        created: { 
           "$gte": new Date("2013-05-01"), 
           "$lt": new Date("2013-05-31") 
        }
    }},

    // Project the date
    { "$project": {
        "date": {
            "year"  : { "$year"  : "$created" },
            "month" : { "$month" : "$created" },
            "day":  : { "$dayOfMonth": "$created" }
        },
        "title": 1
    }},

    // Group on day and title
    { "$group": {
        "_id": {
            "date"  : "$date",
            "title" : "$title"
        },
        "count": { "$sum": 1 }
    }},

    // Sort by date
    { "$sort": { 
        "_id.date.year": 1,
        "_id.date.month": 1,
        "_id.date.day": 1,
    }},

    // Project nicer dates and document
    { "$project": {
        "_id": 0,
        "date": { "$concat": [
            { "$substr": [ "$_id.date.year", 0, 4 ] },
            "-",
            { "$substr": [ "$_id.date.month", 0, 2 ] },
            "-",
            { "$substr": [ "$_id.date.day", 0, 2 ] }
        ]},
        "title": "$_id.title",
        "count": 1
    }}
])