sql >> Databasteknik >  >> NoSQL >> MongoDB

Välj Matchande matriselement och returnera valda fält

Om du bara vill välja vissa fält i en array att returnera så talar du om att "omforma" dokumentet. För allt utöver "grundläggande" fältval betyder det att du använder .aggregate() som metoden istället för .find() .

Så de två kraven här är att $filter på arrayinnehållet för att "matcha" och returnera, samt $map de faktiska "fälten att returnera" från själva arrayen:

User.aggregate([
  { "$match": { "children.name": "def" } },
  { "$project": {
     "name": 1,
     "children": {
       "$map": {
         "input": {
           "$filter": {
             "input": "$children",
             "as": "c",
             "cond": { "$eq": [ "$$c.name", "def" ] } 
           }
         },
         "as": "c",
         "in": {
           "age": "$$c.age",
           "height": "$$c.height"
         }
       }
     }
  }}
])

Här $filter används för att reducera innehållet i arrayen till endast de som matchar villkoret. Att vara de som har samma "name" egenskap som värdet "def" . Detta skickas sedan som "input" parameter till$map .

$map operatorn fungerar precis som andra språkmotsvarigheter genom att den "omformar arrayer" för att returnera något enligt vad du anger i "in" parameter. Så här namnger vi faktiskt bara egenskaperna explicit och använder där variabeltilldelningar för det aktuella arrayelementet som bearbetas så att dessa är vad som returneras som det "nya" arrayinnehållet.

Det övergripande resultatet är en array som innehåller:

  1. Bara de föremål som matchar de angivna villkoren.
  2. Bara de fält som angavs att returnera.



  1. Mongo db-array ändrar strängen till att flyta

  2. Hur man skapar bönan av FindByIndexNameSessionRepository

  3. läser data från specifika noder i mongo-replikuppsättning

  4. Hur gör man denna MongoDB-fråga med java?