Du er på rette vej, men der er et par ting at bemærke her, bortset fra den del, at indlejrede arrays (og især med anonyme nøgler) ikke ligefrem er en god måde at gemme ting på, men så længe du konsekvent kender positionen det burde være nogenlunde i orden.
Der er en klar forskel mellem matchende dokumenter og matchende "elementer af et array" . Selvom din aktuelle værdi faktisk ikke ville matche (din søgeværdi er ikke inden for dokumentets grænser), hvis værdien faktisk var gyldig, matcher din forespørgsel korrekt "dokumentet" her, som indeholder et matchende element i arrayet.
"dokumentet" indeholder alle af array-elementerne, selv dem der ikke matcher, men betingelsen siger "dokument" matcher, så den returneres. Hvis du bare vil have de matchende "elementer" brug derefter .aggregate()
i stedet:
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" }
}}
])
Og det returnerer kun de elementer, der matchede betingelsen:
{
"_id" : ObjectId("536c1145e99dc11e65ed07ce"),
"info" : [
[
1399583285000,
20.13
],
[
1399583286000,
20.13
]
]
}
Eller kursus, hvis du nogensinde kun forventede én element til at matche, så kan du blot bruge projektion med .find()
**:
db.infos.find(
{
"info":{
"$elemMatch":{
"0": {
"$gt": 1399583285000
}
}
}
},
{
"info.$": 1
}
)
Men med et udtryk som $gt
du vil sandsynligvis få flere hits i et dokument, så den samlede tilgang vil være mere sikker i betragtning af, at den positionelle $
operatøren vil kun returnere den første match.