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

Agrégation du groupe d'âge Mongo

Vous étiez au bon endroit, mais en tant que $cond nécessite trois arguments (étant l'évaluation, le résultat vrai et le résultat faux), vous devez "imbriquer" ces opérations, que chaque $cond suivant comme le false condition. Donc, votre syntaxe ici est un peu décalée.

Vous pouvez également le faire uniquement dans le $group pour éviter de parcourir toute la collection avec un $project . Sur la base de la structure de document que vous donnez comme exemple, vous formeriez comme ceci :

$pipeline = array(
  array(
    '$group' => array(
      '_id' => array(
        '$cond' =>  array(
          array('$lt' => array( '$age', 18 )),
          'age_0_17',
          array(
            '$cond' => array(
              array( '$lte' => array( '$age', 25 )),
              'age_18_25',
              array(
                '$cond' => array(
                  array( '$lte' => array ( '$age', 32 )),
                  'age_26_32',
                  'age_Above_32'
                )
              )
            )
          )
        )
      ),
      'count' => array( '$sum' => 1 )
    )
  )
);

Notez également que les opérateurs de comparaison logiques tels que $lt fonctionnent différemment à ces étapes de leurs homologues de requête. Ils prennent eux-mêmes un tableau d'arguments étant les valeurs à tester et à comparer. Ils renvoient true/false basé sur cette comparaison, qui est l'exigence pour le premier argument de $cond .

Toujours pratique d'avoir un json_encode quelque part où vous déboguez le formulaire des requêtes de pipeline, car JSON sera la portée générale des exemples :

echo json_encode( $pipeline, JSON_PRETTY_PRINT ) . "\n";

Ce qui donne la structure JSON commune :

[
    { "$group": {
        "_id": { 
            "$cond":[
                { "$lt":["$age",18] },
                "age_0_17",
                { "$cond":[
                    { "$lte":["$age",25] },
                    "age_18_25",
                    { "$cond":[
                        { "$lte":["$age",32] },
                        "age_26_32",
                        "age_Above_32"
                    ]}
                ]}
            ]
        },
        "count":{ "$sum": 1 }
    }}
]