Anda berada di tempat yang tepat, tetapi sebagai $cond
membutuhkan tiga argumen (menjadi evaluasi , hasil benar dan hasil salah) Anda perlu "menyarangkan" operasi ini, yang setiap $cond
berikutnya sebagai false
kondisi. Jadi sintaks Anda di sini sedikit salah.
Anda juga dapat melakukan ini hanya di $group
untuk menghindari melewati seluruh koleksi dengan $project
. Berdasarkan struktur dokumen yang Anda berikan sebagai contoh Anda akan membentuk seperti ini:
$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 )
)
)
);
Perhatikan juga bahwa operator perbandingan logis seperti $lt
bekerja secara berbeda dalam tahapan ini dengan rekan kueri mereka. Mereka sendiri mengambil serangkaian argumen sebagai nilai untuk diuji dan dibandingkan. Mereka mengembalikan true/false
berdasarkan perbandingan itu, yang merupakan persyaratan untuk argumen pertama ke $cond
.
Selalu berguna untuk memiliki json_encode
di suatu tempat di mana Anda men-debug bentuk kueri pipa, karena JSON akan menjadi lingkup contoh umum:
echo json_encode( $pipeline, JSON_PRETTY_PRINT ) . "\n";
Yang menghasilkan struktur JSON umum:
[
{ "$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 }
}}
]