- Kesalahan sintaks adalah karena Anda harus menggunakan tanda kutip di sekitar
services.port_info - Namun,
$elemMatchdi kolom bertingkat saat ini tidak didukung tetap saja - Untungnya, Anda tidak perlu
$elemMatchuntuk 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.