J'ai ceci...

$group: {
        '_id': this.userId,
        'hours': {
            $sum: '$hours'
        },
        'magazines': {
            $sum: '$magazines'
        },
        'brochures': {
            $sum: '$brochures'
        },
        'books': {
            $sum: 'books'
        }
    }
}, {
    $project: {
        hours: '$hours',
        magazines: '$magazines',
        brochures: '$brochures',
        books: '$books'
    }

... qui renvoie la somme des champs ci-dessus.

Ce que je veux faire, c'est renvoyer la somme totale, disons, d'heures pour un utilisateur particulier, regroupées en mois.

Quelque chose comme:

January:
    userId:
        hours: 10
        magazines: 10
        ....
February:
    userId:
        hours:2
        magazines: 2
etc
1
KhoPhi 24 déc. 2015 à 12:13

2 réponses

Meilleure réponse

C'est la solution qui fonctionne. Réponse sur MongoDB-User group:

[{
        $group: {
            _id: {
                $month: "$createdAt"
            },
            hours: {
                $sum: "$hours",
            },
            magazines: {
                $sum: "$magazines"
            },
            brochures: {
                $sum: "$brochures"
            },
            books: {
                $sum: "$books"
            }
        }
}]
0
KhoPhi 31 déc. 2015 à 12:28

Utilisez le pipeline d'agrégation suivant qui utilise les opérateurs d'agrégation de dates {{X0 }} et $month pour obtenir les sommes totales pour les attributs donnés par utilisateur regroupées en mois:

var pipeline = [
    {
        "$group": {
            "_id": {
                "userId": "$userId"
                "year": { "$year": "$date" }
                "month" { "$month": "$date" }
            },
            'hours': {
                $sum: '$hours'
            },
            'magazines': {
                $sum: '$magazines'
            },
            'brochures': {
                $sum: '$brochures'
            },
            'books': {
                $sum: 'books'
            }
        ]
    }
]

db.collection.aggregate(pipeline);

Pour obtenir le schéma exact dans lequel vous convertissez les valeurs du mois et de l'ID utilisateur en clés, utilisez le map() à partir du curseur renvoyé par la aggregate() méthode:

var result = db.collection.aggregate(pipeline).map(function (doc){
    var obj = {};
    obj[doc._id.month][doc._id.userId]["hours"] = doc.hours;
    obj[doc._id.month][doc._id.userId]["magazines"] = doc.magazines;
    obj[doc._id.month][doc._id.userId]["brochures"] = doc.brochures;
    obj[doc._id.month][doc._id.userId]["books"] = doc.books;

    return obj;
});

printjson(result);
2
chridam 24 déc. 2015 à 12:25