sql >> Database >  >> NoSQL >> MongoDB

Selecteer overeenkomend matrixelement en retourneer geselecteerde velden

Als je alleen bepaalde velden van een array wilt selecteren om te retourneren, dan heb je het over het "hervormen" van het document. Voor alles wat verder gaat dan "basis" veldselectie, betekent dit het gebruik van .aggregate() als de methode in plaats van .find() .

Dus de twee vereisten hier zijn om $filter op de array-inhoud om te "matchen" en terug te geven, evenals $map de daadwerkelijke "te retourneren velden" van de array zelf:

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

Hier $filter wordt gebruikt om de inhoud van de array terug te brengen tot alleen de inhoud die overeenkomt met de voorwaarde. Zijn degenen die dezelfde "name" . hebben eigenschap als de waarde "def" . Dit wordt dan doorgegeven als de "input" parameter to$map .

De $map operator werkt net als zijn tegenhangers in andere talen, omdat het "arrays hervormt" om iets terug te geven volgens wat u opgeeft in de "in" parameter. Dus hier noemen we eigenlijk alleen de eigenschappen expliciet en gebruiken de variabele toewijzingen voor het huidige array-element dat wordt verwerkt, zodat deze worden geretourneerd als de "nieuwe" array-inhoud.

Het algemene resultaat is een array, met daarin:

  1. Alleen de items die voldoen aan de opgegeven voorwaarden.
  2. Alleen de velden die zijn opgegeven om te retourneren.



  1. Mongo-equivalent van SQL's SELECT DISTINCT?

  2. Probleem met toegang tot Mongodb op Amazon EC2

  3. Exporteer één object met mongoexport, hoe specificeer je _id?

  4. Hoe te verwijzen naar een ingesloten document in Mongoid?