Er is niets mis met het gedrag van $elemMatch
. Het werkt zoals verwacht. De doc zegt ook:
Als vuistregel geldt wanneer u een array
project projecteert met behulp van $elemMatch
, slechts één van de elementen wordt maximaal . geprojecteerd . Als geen van de elementen in de array overeenkomt, wordt het veld helemaal niet geprojecteerd.
Het resultaat dat u krijgt is dus correct, alleen het eerste item in de array dat overeenkomt met de voorwaarde in $elemMatch
wordt projected
.
{
"_id" : ObjectId("5439a2992ea8cc0f70feef2d"),
"Statuses" : [{
....
"StatusID": NumberLong(525623822633172993),
....
}]
}
U kunt proberen de volgorde van documenten in de statusarray te wijzigen en mogelijk een ander overeenkomend document krijgen als dat document vóór de andere overeenkomende documenten in de array verschijnt.
Raadpleeg:$elemMatch
Om aan uw vereiste te voldoen, moet u een aggregatiebewerking uitvoeren als u alle overeenkomende array-elementen in uw resultaat wilt hebben.
Match
die documenten met de vereiste _id en die documenten die het statussubdocument bevatten waarnaar we op zoek zijn.unwind
de statussenarray.- Opnieuw
match
de individuele afgewikkelde documenten. - Eindelijk
group
de overeenkomende documenten door_id
.
De code:
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"}}}
])
waarmee u alle overeenkomende subdocumenten in de array krijgt.