- Kesalahan sintaks adalah karena Anda harus menggunakan tanda kutip di sekitar
services.port_info
- Namun,
$elemMatch
di kolom bertingkat saat ini tidak didukung tetap saja - Untungnya, Anda tidak perlu
$elemMatch
untuk kueri semacam ini
Ini harus dilakukan:
db.hosts.find({ ip : "127.0.0.1"}, { "services.port_info.product" : "ssh" });
$elemMatch
diperlukan jika Anda ingin mencocokkan beberapa kriteria di dalam objek array, misalnya "temukan semua di mana port adalah 9000 dan protokolnya adalah UDP". Itu tidak akan didukung dengan struktur data Anda. Saya tidak yakin mengapa port_info
adalah array objek (mungkin untuk situasi yang tidak pasti di mana port dapat dimiliki oleh dua layanan yang berbeda?) - jika itu adalah objek tunggal, bahkan $elemMatch
akan didukung.
Juga, perlu diingat bahwa kueri seperti itu akan selalu mengembalikan seluruh objek.