Saya akan menjelaskan ini dengan sebuah contoh. Pertimbangkan koleksi arrays
. Ini memiliki bidang yang disebut arr
yang merupakan serangkaian dokumen yang disematkan (dengan bidang a
dan b
).
Beberapa dokumen dalam arrays
koleksi:
{ "_id" : 1, "arr" : [ { "a" : "a1", "b" : "b1" }, { "a" : "a2", "b" : "b2" } ] }
{ "_id" : 2, "arr" : [ { "a" : "a1", "b" : "b11" }, { "a" : "a2", "b" : "b22" } ] }
{ "_id" : 3, "arr" : [ { "a" : "a2", "b" : "b1" }, { "a" : "a", "b" : "b1" } ] }
{ "_id" : 4, "arr" : [ { "a" : "a1", "b" : "b91" }, { "a" : "a29", "b" : "b1" } ] }
Saya ingin menemukan semua dokumen dengan bidang dokumen tertanam array a="a1"
DAN b="b1"
. Perhatikan ini harus berada dalam elemen yang sama dengan dokumen tertanam dari array. Saya menggunakan $elemMatch untuk ini dan dapatkan hasil yang diinginkan.
> db.arrays.find( { arr: { $elemMatch: { a: "a1", b: "b1" } } } )
==>
{ "_id" : 1, "arr" : [ { "a" : "a1", "b" : "b1" }, { "a" : "a2", "b" : "b2" } ] }
Sekarang, jika saya menggunakan $and operator seperti pada kueri berikut, hasilnya tidak benar. Seperti yang Anda lihat, dokumen tambahan dipilih. Kueri bekerja dengan bidang dokumen tersemat array a="a1"
ATAU b="b1"
.
> db.arrays.find({$and: [ { "arr.a": "a1" }, { "arr.b": "b1" } ] } )
==>
{ "_id" : 1, "arr" : [ { "a" : "a1", "b" : "b1" }, { "a" : "a2", "b" : "b2" } ] }
{ "_id" : 4, "arr" : [ { "a" : "a1", "b" : "b91" }, { "a" : "a29", "b" : "b1" } ] }
Jadi, menggunakan $and
operator TIDAK dimaksudkan untuk tujuan ini (yaitu, menanyakan beberapa bidang dari larik sub-dokumen).
Juga, untuk melakukan kueri pada bidang dokumen tersemat larik (hanya satu bidang ) $elemMatch
tidak diperlukan, misalnya:
> db.arrays.find( { "arr.a": "a2" } )
==>
{ "_id" : 1, "arr" : [ { "a" : "a1", "b" : "b1" }, { "a" : "a2", "b" : "b2" } ] }
{ "_id" : 2, "arr" : [ { "a" : "a1", "b" : "b11" }, { "a" : "a2", "b" : "b22" } ] }
{ "_id" : 3, "arr" : [ { "a" : "a2", "b" : "b1" }, { "a" : "a", "b" : "b1" } ] }