Ini sebenarnya yang $elemMatch
operator adalah untuk meskipun sering disalahgunakan. Ini pada dasarnya melakukan kondisi kueri pada setiap elemen "di dalam" array. Semua argumen MongoDB adalah operasi "dan" kecuali secara eksplisit disebut sebaliknya:
db.collection.find({ "arr": { "$elemMatch": { "name": "b", "num": 2 } } })
Anda mungkin juga ingin "memproyeksikan" di sini jika Anda hanya mengharapkan bidang yang cocok dan bukan seluruh dokumen:
db.collection.find(
{ "arr": { "$elemMatch": { "name": "b", "num": 2 } } },
{ "arr.$": 1 }
)
Akhirnya untuk menjelaskan mengapa upaya kedua Anda tidak berhasil, kueri ini:
db.collection.find({
"arr": [
{ "name": "b", "num": 2 }
]
})
Tidak cocok dengan apa pun karena tidak ada dokumen aktual di mana "arr" berisi elemen tunggal yang sama persis dengan kondisi Anda.
Contoh pertama Anda gagal..:
db.collection.find({
$and: [
{ "arr.name": "b" },
{ "arr.num": 2 }
]
});
Karena ada beberapa elemen array yang memenuhi kondisi dan ini tidak hanya dianggap bahwa kedua kondisi berlaku untuk elemen yang sama. Itulah yang $elemMatch
menambahkan, dan ketika Anda membutuhkan lebih dari satu kondisi untuk dicocokkan, maka di sinilah Anda menggunakannya.