Anda berada di jalur yang benar, tetapi ada beberapa hal yang perlu diperhatikan di sini, selain dari bagian bahwa array bersarang (dan terutama dengan kunci anonim) bukanlah cara yang bagus untuk menyimpan sesuatu, tetapi selama Anda secara konsisten mengetahui posisinya maka itu seharusnya cukup baik.
Ada perbedaan mencolok antara mencocokkan dokumen dan mencocokkan "elemen larik" . Meskipun nilai Anda saat ini sebenarnya tidak cocok (nilai penelusuran Anda tidak berada dalam batas dokumen), jika nilai tersebut benar-benar valid, kueri Anda cocok dengan "dokumen" di sini, yang berisi elemen yang cocok dalam larik.
"dokumen" berisi semua dari elemen array, bahkan yang tidak cocok, tetapi kondisinya mengatakan "dokumen" cocok, jadi dikembalikan. Jika Anda hanya ingin "elemen" yang cocok lalu gunakan .aggregate()
sebagai gantinya:
db.infos.aggregate([
// Still match the document
{ "$match": {
"info": {
"$elemMatch": { "0": {"$gte": 1399583285000} }
}
}},
// unwind the array for the matched documents
{ "$unwind": "$info" },
// Match only the elements
{ "$match": { "info.0": { "$gte": 1399583285000 } } },
// Group back to the original form if you want
{ "$group": {
"_id": "$_id",
"info": { "$push": "$info" }
}}
])
Dan itu hanya mengembalikan elemen yang cocok dengan kondisi:
{
"_id" : ObjectId("536c1145e99dc11e65ed07ce"),
"info" : [
[
1399583285000,
20.13
],
[
1399583286000,
20.13
]
]
}
Atau tentu saja jika Anda hanya mengharapkan satu elemen untuk dicocokkan, maka Anda cukup menggunakan proyeksi dengan .find()
**:
db.infos.find(
{
"info":{
"$elemMatch":{
"0": {
"$gt": 1399583285000
}
}
}
},
{
"info.$": 1
}
)
Tapi dengan istilah seperti $gt
Anda mungkin mendapatkan banyak klik dalam dokumen sehingga pendekatan agregat akan lebih aman mengingat $
posisional operator hanya akan mengembalikan pertama cocok.