Jste na správné cestě, ale je zde několik věcí, které je třeba si povšimnout, kromě části, že vnořená pole (a zvláště s anonymními klíči) nejsou zrovna skvělým způsobem ukládání věcí, ale pokud důsledně znáte polohu, pak to by mělo být přiměřeně v pořádku.
Mezi odpovídajícími dokumenty je výrazný rozdíl a odpovídající "prvky pole" . I když by se vaše aktuální hodnota ve skutečnosti neshodovala (vaše hledaná hodnota není v mezích dokumentu), pokud byla hodnota skutečně platná, váš dotaz správně odpovídá "dokumentu" zde, který obsahuje odpovídající prvek v poli.
"dokument" obsahuje vše prvků pole, a to i těch, které se neshodují, ale podmínka říká "dokument" odpovídá, takže je vráceno. Pokud chcete pouze odpovídající "prvky" pak použijte .aggregate()
místo toho:
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" }
}}
])
A to vrátí pouze prvky, které odpovídaly podmínce:
{
"_id" : ObjectId("536c1145e99dc11e65ed07ce"),
"info" : [
[
1399583285000,
20.13
],
[
1399583286000,
20.13
]
]
}
Nebo samozřejmě, pokud jste kdy očekávali jen jeden prvek, který se má shodovat, pak můžete jednoduše použít projekci pomocí .find()
**:
db.infos.find(
{
"info":{
"$elemMatch":{
"0": {
"$gt": 1399583285000
}
}
}
},
{
"info.$": 1
}
)
Ale s výrazem jako $gt
pravděpodobně získáte v dokumentu více požadavků, takže agregovaný přístup bude bezpečnější vzhledem k tomu, že poziční $
operátor vrátí pouze první zápas.