Karena array bersarang, Anda tidak dapat menggunakan proyeksi dasar seperti yang Anda bisa dengan find. Juga untuk "memfilter" konten array dari dokumen, Anda perlu "melepaskan" konten array terlebih dahulu. Untuk ini, Anda menggunakan kerangka kerja agregasi:
$results = $db->genealogical_data->aggregate(array(
array( '$match' => array(
'people.search_columns.givenname' => 'Valentine'
)),
array( '$unwind' => '$people' ),
array( '$match' => array(
'people.search_columns.givenname' => 'Valentine'
)),
array( '$group' => array(
'_id' => '$id',
'name' => array( '$first' => '$name' ),
'people' => array( '$push' => '$people' )
))
));
Inti dari $match
tahap adalah untuk mengurangi dokumen yang mungkin cocok dengan kriteria Anda. Kedua kalinya dilakukan setelah $unwind
, di mana item "array" sebenarnya dalam dokumen "difilter" dari hasil.
$group
terakhir
mengembalikan larik asli ke normal, dikurangi item yang tidak sesuai dengan kriteria.