Il n'y a rien de mal avec le comportement de $elemMatch . Cela fonctionne comme prévu. La doc dit aussi :
En règle générale, chaque fois que vous projetez un array en utilisant $elemMatch , un seul des éléments seront projetés au maximum . Si aucun des éléments du tableau ne correspond, le champ ne sera pas projeté du tout.
Ainsi, le résultat que vous obtenez est correct, seul le premier élément du tableau correspondant à la condition dans $elemMatch sera projected .
{
"_id" : ObjectId("5439a2992ea8cc0f70feef2d"),
"Statuses" : [{
....
"StatusID": NumberLong(525623822633172993),
....
}]
}
Vous pouvez essayer de modifier l'ordre des documents dans le tableau des statuts et obtenir un document correspondant différent si ce document apparaît avant les autres documents correspondants dans le tableau.
Référez-vous :$elemMatch
En ce qui concerne vos besoins, si vous voulez que tous les éléments de tableau correspondants dans votre résultat, vous devez effectuer une opération d'agrégation.
Matchles documents ayant le _id requis et les documents contenant le sous-document d'état que nous recherchons.unwindle tableau des statuts.- Encore
matchles documents individuels déroulés. - Enfin
grouples documents correspondants par_id.
Le 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"}}}
])
qui vous donnera tous les sous-documents correspondants dans le tableau.