sql >> Database teknologi >  >> NoSQL >> MongoDB

MongoDB elemMatch virker ikke forventet

Der er intet galt med adfærden for $elemMatch . Det fungerer som forventet. Lægen siger også:

Som en tommelfingerregel, når du projicerer et array ved hjælp af $elemMatch , kun én af elementerne vil blive projiceret højst . Hvis ingen af ​​elementerne i arrayet matcher, vil feltet slet ikke blive projiceret.

Så resultatet du får er korrekt, kun det første element i arrayet, der matchede betingelsen i $elemMatch vil blive projected .

{
    "_id" : ObjectId("5439a2992ea8cc0f70feef2d"),
    "Statuses" : [{
        ....
        "StatusID": NumberLong(525623822633172993),
        ....
    }]
}

Du kan prøve at ændre rækkefølgen af ​​dokumenter i arrayet med statusser og muligvis få et andet matchende dokument, hvis det dokument vises foran de andre matchende dokumenter i arrayet.

Se:$elemMatch

Når du kommer til dit krav, skal du udføre en aggregeringsoperation, hvis du vil have alle de matchende array-elementer i dit resultat.

  • Match de dokumenter, der har det påkrævede _id, og de dokumenter, der indeholder det statusunderdokument, som vi søger efter.
  • unwind statusarrayet.
  • Igen match de enkelte afviklede dokumenter.
  • Endelig group de matchede dokumenter 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 vil give dig alle de matchende underdokumenter i arrayet.



  1. Data null efter lagring af enhed med Moongose ​​og GraphQL

  2. Indsættelse af et stort udvalg af objekter i mongodb fra nodejs

  3. 3 måder at vælge rækken med den maksimale værdi i SQL

  4. Hvordan omdøber man feltnavnet i Spring-mongodb, når data indsættes?