Det är inget fel med beteendet hos $elemMatch
. Det fungerar som förväntat. Läkaren säger också:
Som en tumregel när du projicerar en array
med $elemMatch
, endast en av elementen kommer att projiceras högst . Om inget av elementen i arrayen matchar kommer fältet inte att projiceras alls.
Så resultatet du får är korrekt, bara det första objektet i arrayen som har matchat villkoret i $elemMatch
kommer att projected
.
{
"_id" : ObjectId("5439a2992ea8cc0f70feef2d"),
"Statuses" : [{
....
"StatusID": NumberLong(525623822633172993),
....
}]
}
Du kan prova att ändra ordningen på dokument i statusmatrisen och kan få ett annat matchande dokument om det dokumentet visas före de andra matchande dokumenten i matrisen.
Se:$elemMatch
När du kommer till ditt krav, om du vill ha alla matchande matriselement i ditt resultat, måste du utföra en aggregeringsoperation.
Match
de dokument som har det erforderliga _id och de dokument som innehåller statusunderdokumentet som vi söker efter.unwind
statusarrayen.- Återigen
match
de enskilda avvecklade dokumenten. - Äntligen
group
de matchade dokumenten 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 ger dig alla matchande underdokument i arrayen.