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.
Match
ty dokumenty, které mají požadované _id, a ty dokumenty, které obsahují stavový dílčí dokument, který hledáme.unwind
pole stavů.- Opět
match
jednotlivé odvinuté dokumenty. - Nakonec
group
odpoví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.