Sie waren am richtigen Ort, aber als $cond
erfordert drei Argumente (die Auswertung, das wahre Ergebnis und das falsche Ergebnis) Sie müssen diese Operationen "verschachteln", die jede nachfolgende $cond
als false
Bedingung. Also ist Ihre Syntax hier ein wenig daneben.
Sie können dies auch einfach in der $group
um zu vermeiden, dass die gesamte Sammlung mit einem separaten $project
. Basierend auf der Dokumentstruktur, die Sie als Beispiel angeben, würden Sie so aussehen:
$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 )
)
)
);
Beachten Sie auch, dass logische Vergleichsoperatoren wie $lt
funktionieren in diesen Phasen anders als ihre Abfrage-Pendants. Sie selbst verwenden eine Reihe von Argumenten, die die zu testenden und zu vergleichenden Werte darstellen. Sie geben true/false
zurück basierend auf diesem Vergleich, was die Voraussetzung für das erste Argument von $cond
ist .
Immer praktisch, einen json_encode
zu haben irgendwo, wo Sie die Form von Pipeline-Abfragen debuggen, da JSON der allgemeine Anwendungsbereich von Beispielen sein wird:
echo json_encode( $pipeline, JSON_PRETTY_PRINT ) . "\n";
Was die gemeinsame JSON-Struktur ergibt:
[
{ "$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 }
}}
]