Na chování $elemMatch není nic špatného . Funguje podle očekávání. Doktor také říká:
Zpravidla vždy, když promítáte array pomocí $elemMatch , pouze jeden prvků se promítne nanejvýš . Pokud se žádný z prvků v poli neshoduje, pole se vůbec nepromítne.
Takže výsledek, který dostanete, je správný, pouze první položka v poli, která odpovídala podmínce v $elemMatch bude projected .
{
"_id" : ObjectId("5439a2992ea8cc0f70feef2d"),
"Statuses" : [{
....
"StatusID": NumberLong(525623822633172993),
....
}]
}
Můžete zkusit změnit pořadí dokumentů v poli stavů a můžete získat jiný odpovídající dokument, pokud se tento dokument objeví před ostatními odpovídajícími dokumenty v poli.
Viz:$elemMatch
Pokud jde o váš požadavek, chcete-li mít ve výsledku všechny odpovídající prvky pole, musíte provést operaci agregace.
Matchty dokumenty, které mají požadované _id, a ty dokumenty, které obsahují stavový dílčí dokument, který hledáme.unwindpole stavů.- Opět
matchjednotlivé odvinuté dokumenty. - Nakonec
groupodpovídající dokumenty podle_id.
Kód:
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"}}}
])
což vám poskytne všechny odpovídající dílčí dokumenty v poli.