MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MongoDB elemMatch ne fonctionne pas comme prévu

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.