sql >> Databasteknik >  >> NoSQL >> MongoDB

Mongo Grupp och summa med två fält

Eftersom du behöver beräkna antalet e-postmeddelanden som utbyts mellan 2 adresser skulle det vara rättvist att projicera en enhetlig between fältet enligt följande:

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 } }
])

Enhetslogik bör vara ganska tydlig från exemplet:det är en alfabetiskt sorterad uppsättning av båda e-postmeddelandena. $match och $toLower delar är valfria om du litar på dina data.

Dokumentation för operatorer som används i exemplet:



  1. Hur man skriver Mongo-fråga för att hitta underdokument med villkor

  2. MongoDB-fråga på det n:te elementet (variabelt index) i underdokumentmatrisen

  3. Ta bara bort ett dokument i MongoDB

  4. Hur kan jag behålla nolllängdsvärden under $unwind-fasen av den samlade pipelinen i Mongo?