web-dev-qa-db-fra.com

Comment agréger par date lorsqu'un horodatage complet est donné dans le cadre d'agrégation?

J'ai une collection d'erreurs, de sorte que chaque erreur porte un champ date. Comment puis-je agréger/compter/grouper les erreurs par jour seulement (c'est-à-dire exclure l'heure de la journée)? Je suppose que certaines projections intelligentes devraient être appliquées.

26
BreakPhreak

Pour ce faire, utilisez les opérateurs d'agrégation suivants:

Cela vous donne le nombre d'erreurs pour chaque date:

db.errors.aggregate(
    { $group : {
        _id: {
            year : { $year : "$date" },        
            month : { $month : "$date" },        
            day : { $dayOfMonth : "$date" },
        },
        count: { $sum: 1 }
    }}
);

Cet exemple suppose que le champ de date dans vos documents d'erreur est date et de type BSON Date . Il existe également un type d'horodatage dans MongoDB, mais l'utilisation de ce type est explicitement déconseillée par la documentation :

Remarque: Le type d'horodatage BSON est destiné à un usage interne de MongoDB. Dans la plupart des cas, dans le développement d'applications, vous souhaiterez utiliser le type de date BSON. Voir Date pour plus d'informations.

54
Philipp

Vous pouvez convertir votre champ d'horodatage en chaîne avec un format de date spécifique en utilisant $ projet (agrégation)

aggregate([
    {
        '$project': {
            newFieldName: {'$dateToString': {format: '%Y-%m-%d', date: '$yourDateFieldName'}}
        }
    }, {
        '$group': {
            _id: {newFieldName: '$newFieldName'},
            viewCount: {'$sum': 1}
        }
    }, 
    {'$sort': {'_id.newFieldName': 1}}
], {})
4
Dmitry Sergeev