sql >> Database >  >> NoSQL >> MongoDB

Mongo Group en som met twee velden

Aangezien u het aantal e-mails moet berekenen dat tussen is uitgewisseld 2 adressen, zou het eerlijk zijn om een ​​uniforme between . te projecteren veld als volgt:

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

Unificatielogica zou uit het voorbeeld vrij duidelijk moeten zijn:het is een alfabetisch gesorteerde reeks van beide e-mails. De $match en $toLower onderdelen zijn optioneel als u uw gegevens vertrouwt.

Documentatie voor operators die in het voorbeeld worden gebruikt:



  1. Multifield-indexen maken in Mongoose / MongoDB

  2. MongoDB, java.lang.NoSuchFieldError

  3. rails + docker + sidekiq + Fout bij verbinden met Redis op 127.0.0.1:6379 (Errno::ECONNREFUSED)

  4. Hoe geüpdatete waarden alleen projecteren met findOneAndUpdate in embedded array Mongoose?