sql >> Base de Datos >  >> NoSQL >> MongoDB

Grupo Mongo y suma con dos campos.

Dado que necesita calcular la cantidad de correos electrónicos intercambiados entre 2 direcciones, sería justo proyectar un between unificado campo de la siguiente manera:

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 lógica de unificación debería ser bastante clara a partir del ejemplo:es una matriz ordenada alfabéticamente de ambos correos electrónicos. El $match y $toLower las partes son opcionales si confía en sus datos.

Documentación para los operadores utilizados en el ejemplo: