31 votes

Compter les groupes avec MongoDB à l'aide de la structure d'agrégation

Disons que mon schéma MongoDB ressemble à ceci:

 {car_id: "...", owner_id: "..."}
 

C'est une relation plusieurs à plusieurs. Par exemple, les données pourraient ressembler à ceci:

 +-----+----------+--------+
| _id | owner_id | car_id |
+-----+----------+--------+
|   1 |        1 |      1 |
|   2 |        1 |      2 |
|   3 |        1 |      3 |
|   4 |        2 |      1 |
|   5 |        2 |      2 |
|   6 |        3 |      4 |
|   7 |        3 |      5 |
|   8 |        3 |      6 |
|   9 |        3 |      7 |
|  10 |        1 |      1 | <-- not unique
+-----+----------+--------+
 

Je veux connaître le nombre de voitures appartenant à chaque propriétaire. En SQL, cela pourrait ressembler à:

 SELECT owner_id, COUNT(*) AS cars_owned
FROM (SELECT owner_id FROM car_owners GROUP BY owner_id, car_id) AS t
GROUP BY owner_id;
 

Dans ce cas, le résultat ressemblerait à ceci:

 +----------+------------+
| owner_id | cars_owned |
+----------+------------+
|        1 |          3 |
|        2 |          2 |
|        3 |          4 |
+----------+------------+
 

Comment puis-je accomplir la même chose en utilisant MongoDB en utilisant le framework d'agrégation?

58voto

JohnnyHK Points 61191

Pour prendre en charge les doublons potentiels, vous devez utiliser deux opérations $group :

 db.test.aggregate([
    { $group: {
        _id: { owner_id: '$owner_id', car_id: '$car_id' }
    }},
    { $group: {
        _id: '$_id.owner_id',
        cars_owned: { $sum: 1 }
    }},
    { $project: {
        _id: 0,
        owner_id: '$_id',
        cars_owned: 1
    }}]
    , function(err, result){
        console.log(result);
    }
);
 

Donne un résultat avec un format de:

 [ { cars_owned: 2, owner_id: 10 },
  { cars_owned: 1, owner_id: 11 } ]
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X