Tidak ada yang salah dengan perilaku $elemMatch
. Ia bekerja seperti yang diharapkan. Dokter juga mengatakan:
Sebagai aturan praktis setiap kali Anda memproyeksikan array
menggunakan $elemMatch
, hanya satu elemen akan diproyeksikan paling banyak . Jika tidak ada elemen dalam larik yang cocok, bidang tidak akan diproyeksikan sama sekali.
Jadi hasil yang Anda dapatkan benar, hanya item pertama dalam array yang sesuai dengan kondisi di $elemMatch
akan projected
.
{
"_id" : ObjectId("5439a2992ea8cc0f70feef2d"),
"Statuses" : [{
....
"StatusID": NumberLong(525623822633172993),
....
}]
}
Anda dapat mencoba mengubah urutan dokumen dalam larik status, dan mungkin mendapatkan dokumen pencocokan yang berbeda jika dokumen tersebut muncul di depan dokumen lain yang cocok dalam larik.
Lihat:$elemMatch
Datang ke kebutuhan Anda, jika Anda ingin semua elemen array yang cocok dalam hasil Anda, Anda perlu melakukan operasi agregasi.
Match
dokumen-dokumen yang memiliki _id yang diperlukan dan dokumen-dokumen yang berisi sub dokumen status yang kita cari.unwind
larik status.- Lagi
match
dokumen individu yang dibuka. - Akhirnya
group
dokumen yang cocok dengan_id
.
Kode:
db.collection.aggregate([
{$match:{ "_id": ObjectId("5439a2992ea8cc0f70feef2d"),
"Statuses.StatusID":{$gte : NumberLong(525623822633172993)}}},
{$unwind:"$Statuses"},
{$match:{"Statuses.StatusID":{$gte : NumberLong(525623822633172993)}}},
{$group:{"_id":"$_id",statuses:{$push:"$Statuses"}}}
])
yang akan memberi Anda semua sub dokumen yang cocok dalam larik.