Der er intet galt med adfærden for $elemMatch
. Det fungerer som forventet. Lægen siger også:
Som en tommelfingerregel, når du projicerer et array
ved hjælp af $elemMatch
, kun én af elementerne vil blive projiceret højst . Hvis ingen af elementerne i arrayet matcher, vil feltet slet ikke blive projiceret.
Så resultatet du får er korrekt, kun det første element i arrayet, der matchede betingelsen i $elemMatch
vil blive projected
.
{
"_id" : ObjectId("5439a2992ea8cc0f70feef2d"),
"Statuses" : [{
....
"StatusID": NumberLong(525623822633172993),
....
}]
}
Du kan prøve at ændre rækkefølgen af dokumenter i arrayet med statusser og muligvis få et andet matchende dokument, hvis det dokument vises foran de andre matchende dokumenter i arrayet.
Se:$elemMatch
Når du kommer til dit krav, skal du udføre en aggregeringsoperation, hvis du vil have alle de matchende array-elementer i dit resultat.
Match
de dokumenter, der har det påkrævede _id, og de dokumenter, der indeholder det statusunderdokument, som vi søger efter.unwind
statusarrayet.- Igen
match
de enkelte afviklede dokumenter. - Endelig
group
de matchede dokumenter med_id
.
Koden:
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"}}}
])
som vil give dig alle de matchende underdokumenter i arrayet.