sql >> Database >  >> NoSQL >> MongoDB

MongoDB elemMatch werkt niet verwacht

Er is niets mis met het gedrag van $elemMatch . Het werkt zoals verwacht. De doc zegt ook:

Als vuistregel geldt wanneer u een array project projecteert met behulp van $elemMatch , slechts één van de elementen wordt maximaal . geprojecteerd . Als geen van de elementen in de array overeenkomt, wordt het veld helemaal niet geprojecteerd.

Het resultaat dat u krijgt is dus correct, alleen het eerste item in de array dat overeenkomt met de voorwaarde in $elemMatch wordt projected .

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

U kunt proberen de volgorde van documenten in de statusarray te wijzigen en mogelijk een ander overeenkomend document krijgen als dat document vóór de andere overeenkomende documenten in de array verschijnt.

Raadpleeg:$elemMatch

Om aan uw vereiste te voldoen, moet u een aggregatiebewerking uitvoeren als u alle overeenkomende array-elementen in uw resultaat wilt hebben.

  • Match die documenten met de vereiste _id en die documenten die het statussubdocument bevatten waarnaar we op zoek zijn.
  • unwind de statussenarray.
  • Opnieuw match de individuele afgewikkelde documenten.
  • Eindelijk group de overeenkomende documenten door _id .

De 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"}}}
])

waarmee u alle overeenkomende subdocumenten in de array krijgt.



  1. Pymongo krijgt ingevoegde id's, zelfs met dubbele sleutelfout

  2. Gebruik de operator AND - in de zoekmethode

  3. MongoDB Composite Key:InvalidOperationException:{document}.Identiteit wordt niet ondersteund

  4. Mongoose -- Naam verzameling forceren