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.
Matchdokumen-dokumen yang memiliki _id yang diperlukan dan dokumen-dokumen yang berisi sub dokumen status yang kita cari.unwindlarik status.- Lagi
matchdokumen individu yang dibuka. - Akhirnya
groupdokumen 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.