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.
Matchde dokument som har det erforderliga _id och de dokument som innehåller statusunderdokumentet som vi söker efter.unwindstatusarrayen.- Återigen
matchde enskilda avvecklade dokumenten. - Äntligen
groupde 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.