Sebenarnya ada "gotcha" yang tercantum dalam dokumentasi untuk $type
khusus tentang array:
Saat diterapkan ke array, $type cocok dengan elemen dalam apa pun yang bertipe tertentu. Tanpa proyeksi ini berarti bahwa seluruh array akan cocok jika ada elemen yang memiliki tipe yang tepat. Dengan proyeksi, hasilnya hanya akan mencakup elemen-elemen dari jenis yang diminta.
Jadi itu berarti bahwa alih-alih mendeteksi apakah "elemen itu sendiri" ada dalam larik, yang sebenarnya sedang diuji adalah "elemen dalam" larik untuk melihat jenisnya.
Sekarang dokumentasi itu sendiri menyarankan pengujian JavaScript ini dengan $where
:
.find({ "$where": "return Array.isArray(this.author)" })
Tapi saya pikir itu cukup mengerikan karena ada cara yang lebih baik.
Caranya ada di "notasi titik", di mana Anda meminta 0
indeks elemen larik ke $exists
.find({ "author.0": { "$exists": true } })
Yang merupakan kasus dasar bahwa jika elemen "0" ada, maka bidang tersebut ada dan oleh karena itu datanya adalah sebuah array.
Setelah Anda memahami premis logis itu, itu adalah tes yang cukup sederhana. Satu-satunya hal yang tidak dapat dicocokkan dengan itu adalah larik "benar-benar kosong", dalam hal ini Anda dapat kembali ke alternatif JavaScript jika diperlukan. Tapi ini sebenarnya bisa menggunakan indeks, jadi lebih baik menggunakan bentuk yang terakhir.