sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB elemMatch fungerar inte förväntat

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.

  • Match de dokument som har det erforderliga _id och de dokument som innehåller statusunderdokumentet som vi söker efter.
  • unwind statusarrayen.
  • Återigen match de enskilda avvecklade dokumenten.
  • Äntligen group de 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.



  1. Skapa filteraggregation på våren

  2. Hur kan jag köra redis på en enda server på olika portar?

  3. MongoDB:undantag i initAndListen:20 Försökte skapa en låsfil på en skrivskyddad katalog:/data/db, avslutande

  4. Hur man kommer åt kapslade filer med Pick<> typscript