Delen via


FROM-component (NoSQL-query)

VAN TOEPASSING OP: NoSQL

De COMPONENT FROM (FROM <from_specification>) is optioneel, tenzij de bron later in de query wordt gefilterd of geprojecteerd. Een query, zoals SELECT * FROM products opsomming, over een hele container, ongeacht de naam. U kunt ook de speciale id ROOT voor de container gebruiken in plaats van de containernaam te gebruiken.

Met FROM de component worden de volgende regels per query afgedwongen:

  • Voor de container kunt u een alias gebruiken, zoals SELECT p.id FROM products AS p of gewoon SELECT p.id FROM products p. Hier is p de alias voor de container. De container hoeft niet noodzakelijkerwijs een naam products te hebben of p. AS is een optioneel trefwoord om de id te aliasen .
  • Zodra de alias is gebruikt, kan de oorspronkelijke bronnaam niet worden gebonden. Is bijvoorbeeld SELECT products.id FROM products p syntactisch ongeldig omdat de id products is gealiaseerd en niet meer kan worden omgezet.
  • Alle eigenschappen waarnaar wordt verwezen, moeten volledig gekwalificeerd zijn, om te voorkomen dat dubbelzinnige bindingen worden gebruikt als er geen strikte schema-naleving is. Is bijvoorbeeld SELECT id FROM products p syntactisch ongeldig omdat de eigenschap id niet is gebonden. De query moet in plaats daarvan verwijzen naar de eigenschap id met behulp van p.id (of <alias>.<property-name>).

Syntaxis

FROM <from_specification>  
  
<from_specification> ::=
        <from_source> {[ JOIN <from_source>][,...n]}  
  
<from_source> ::=
          <container_expression> [[AS] input_alias]  
        | input_alias IN <container_expression>  
  
<container_expression> ::=
        ROOT
     | container_name  
     | input_alias  
     | <container_expression> '.' property_name  
     | <container_expression> '[' "property_name" | array_index ']'

Argumenten

Beschrijving
<from_source> Hiermee geeft u een gegevensbron, met of zonder alias. Als de alias niet is opgegeven, wordt deze afgeleid van de <container_expression> volgende regels. Als de expressie een container_name, wordt container_name gebruikt als een alias. Als de expressie is <container_expression>, wordt deze property_name gebruikt als alias. Als de expressie een container_name, wordt container_name gebruikt als een alias.
ALS input_alias Hiermee geeft u op dat het input_alias een set waarden is die wordt geretourneerd door de onderliggende containerexpressie.
input_alias IN Hiermee geeft u op dat de input_alias set waarden moet vertegenwoordigen die zijn verkregen door alle matrixelementen van elke matrix te herhalen die wordt geretourneerd door de onderliggende containerexpressie. Elke waarde die wordt geretourneerd door de onderliggende containerexpressie die geen matrix is, wordt genegeerd.
<container_expression> Hiermee geeft u de containerexpressie die moet worden gebruikt om de items op te halen.
ROOT Hiermee geeft u op dat het item moet worden opgehaald uit de standaardcontainer die momenteel is verbonden.
container_name Hiermee geeft u op dat het item moet worden opgehaald uit de opgegeven container. De naam van de container moet overeenkomen met de naam van de container die momenteel is verbonden.
input_alias Hiermee geeft u op dat het item moet worden opgehaald uit de andere bron die is gedefinieerd door de opgegeven alias.
<container_expression> '.' property_name Hiermee geeft u op dat het item moet worden opgehaald door toegang te krijgen tot de property_name eigenschap.
<container_expression> '[' "property_name" \| array_index ']' Hiermee geeft u op dat het item moet worden opgehaald door toegang te krijgen tot de property_name eigenschap of array_index het matrixelement voor alle items die zijn opgehaald door de opgegeven containerexpressie.

Opmerkingen

Alle aliassen die in de <from_source>(s) zijn opgegeven of afgeleid, moeten uniek zijn. De syntaxis <container_expression> '.' property_name is hetzelfde als <container_expression> '[' "property_name" ']'. De laatste syntaxis kan echter worden gebruikt als een eigenschapsnaam een niet-id bevat.

Ontbrekende eigenschappen, ontbrekende matrixelementen en niet-gedefinieerde waarden verwerken

Als een containerexpressie toegang heeft tot eigenschappen of matrixelementen en die waarde niet bestaat, wordt die waarde genegeerd en niet verder verwerkt.

Bereik van context van containerexpressie

Een containerexpressie kan een containerbereik of itembereik hebben:

  • Een expressie is containerbereik, als de onderliggende bron van de containerexpressie een of ROOT container_name. Een dergelijke expressie vertegenwoordigt een set items die rechtstreeks uit de container zijn opgehaald en is niet afhankelijk van de verwerking van andere containerexpressies.

  • Een expressie is itembereik, als de onderliggende bron van de containerexpressie eerder in de query wordt input_alias geïntroduceerd. Een dergelijke expressie vertegenwoordigt een set items die zijn verkregen door de containerexpressie te evalueren. Deze evaluatie wordt uitgevoerd in het bereik van elk item dat deel uitmaakt van de set die is gekoppeld aan de aliascontainer. De resulterende set is een samenvoeging van sets die zijn verkregen door de containerexpressie te evalueren voor elk van de items in de onderliggende set.

Voorbeelden

In dit eerste voorbeeld wordt de FROM component gebruikt om de huidige container als bron op te geven, deze een unieke naam te geven en deze vervolgens een alias te geven. De alias wordt vervolgens gebruikt om specifieke velden in de queryresultaten te projecteren.

SELECT VALUE {
    name: e.name,
    location: e.workLocation
}
FROM
    employees e
[
  {
    "name": "Tijana Stanković",
    "location": {
      "office": "Redmond, WA"
    }
  },
  {
    "name": "Jean Nadeau",
    "location": {
      "type": "Remote"
    }
  }
]

In dit volgende voorbeeld kan de FROM component ook de bron beperken tot een kleinere subset. Als u slechts een substructuur in elk item wilt inventariseren, kan de subroot de bron worden. Een subhoofdmap van een matrix of object kan als bron worden gebruikt.

SELECT 
    *
FROM
    employees.employment e
[
  {
    "hireDateTime": "2023-01-01T06:30:00.000Z",
    "weeklyHours": 40,
    "team": "Retail support"
  },
  {
    "hireDateTime": "2023-01-01T09:30:00.000Z",
    "team": "Retail support"
  },
  {
    "hireDateTime": "2023-01-01T15:30:00.000Z",
    "weeklyHours": 32,
    "team": "Retail support"
  }
]