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

Groupe Mongo et somme avec deux champs

Étant donné que vous devez calculer le nombre d'e-mails échangés entre 2 adresses, il serait juste de projeter un between unifié champ comme suit :

db.a.aggregate([
    { $match: {
        to: { $exists: true },
        from: { $exists: true },
        email: { $exists: true }
    }}, 
    { $project: {
        between: { $cond: { 
            if: { $lte: [ { $strcasecmp: [ "$to", "$from" ] }, 0 ] }, 
            then: [ { $toLower: "$to" }, { $toLower: "$from" } ], 
            else: [ { $toLower: "$from" }, { $toLower: "$to" } ] }
        } 
    }},
    { $group: {
         "_id": "$between",
         "count": { $sum: 1 } 
    }},
    { $sort :{ count: -1 } }
])

La logique d'unification devrait être assez claire à partir de l'exemple :il s'agit d'un tableau trié par ordre alphabétique des deux e-mails. Le $match et $toLower les parties sont facultatives si vous faites confiance à vos données.

Documentation pour les opérateurs utilisés dans l'exemple :