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.
Match
les documents ayant le _id requis et les documents contenant le sous-document d'état que nous recherchons.unwind
le tableau des statuts.- Encore
match
les documents individuels déroulés. - Enfin
group
les 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.