Klausa FROM (kueri NoSQL)

BERLAKU UNTUK: NoSQL

Klausa FROM (FROM <from_specification> ) bersifat opsional, kecuali sumber difilter atau diproyeksikan nanti dalam kueri. Kueri seperti SELECT * FROM products menghitung seluruh kontainer terlepas dari namanya. Anda juga dapat menggunakan pengidentifikasi ROOT khusus untuk kontainer alih-alih menggunakan nama kontainer.

FROMKlausa memberlakukan aturan berikut per kueri:

  • Wadah dapat alias, seperti atau SELECT p.id FROM products AS p hanya SELECT p.id FROM products p. Di sini, p adalah alias untuk kontainer. Kontainer tidak harus diberi nama products atau p. AS adalah kata kunci opsional untuk alias pengidentifikasi.
  • Setelah alias, nama sumber asli tidak dapat terikat. Misalnya, SELECT products.id FROM products p secara sintaks tidak valid karena pengidentifikasi products telah diberi alias dan tidak dapat diselesaikan lagi.
  • Semua properti yang direferensikan harus sepenuhnya memenuhi syarat, untuk menghindari ikatan ambigu tanpa adanya kepatuhan skema yang ketat. Misalnya, SELECT id FROM products p secara sintaksis tidak valid karena propertiid tidak terikat. Kueri harus mereferensikan properti id menggunakan p.id (atau <alias>.<property-name>).

Sintaks

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 ']'

Argumen

Deskripsi
<from_source> Menentukan sumber data, dengan atau tanpa alias. Jika alias tidak ditentukan, alias disimpulkan dari menggunakan aturan berikut <container_expression> . Jika ekspresi adalah container_name, maka container_name digunakan sebagai alias. Jika ekspresi adalah <container_expression>, maka property_name digunakan sebagai alias. Jika ekspresi adalah container_name, maka container_name digunakan sebagai alias.
SEBAGAI input_alias Menentukan bahwa input_alias kumpulan nilai yang dikembalikan oleh ekspresi kontainer yang mendasarinya.
input_alias IN Menentukan bahwa input_alias kumpulan nilai yang harus mewakili kumpulan nilai yang diperoleh dengan melakukan iterasi atas semua elemen array dari setiap array yang dikembalikan oleh ekspresi kontainer yang mendasarinya. Nilai apa pun yang dikembalikan oleh ekspresi kontainer yang mendasar yang bukan array diabaikan.
<container_expression> Menentukan ekspresi kontainer yang akan digunakan untuk mengambil item.
ROOT Menentukan bahwa item harus diambil dari kontainer default yang saat ini tersambung.
container_name Menentukan bahwa item harus diambil dari kontainer yang disediakan. Nama kontainer harus cocok dengan nama kontainer yang saat ini tersambung.
input_alias Menentukan bahwa item harus diambil dari sumber lain yang ditentukan oleh alias yang disediakan.
<container_expression> '.' property_name Menentukan bahwa item harus diambil dengan mengakses property_name properti .
<container_expression> '[' "property_name" \| array_index ']' Menentukan bahwa item harus diambil dengan mengakses property_name properti atau array_index elemen array untuk semua item yang diambil oleh ekspresi kontainer yang ditentukan.

Keterangan

Semua alias yang disediakan atau disimpulkan dalam <from_source> harus unik. Sintaks <container_expression> '.' property_name sama dengan <container_expression> '[' "property_name" ']'. Namun, sintaks terakhir dapat digunakan jika nama properti berisi karakter nonidentifier.

Menangani properti yang hilang, elemen array yang hilang, dan nilai yang tidak terdefinisi

Jika ekspresi kontainer mengakses properti atau elemen array dan nilai tersebut tidak ada, nilai tersebut diabaikan dan tidak diproses lebih lanjut.

Pelingkus konteks ekspresi kontainer

Ekspresi kontainer mungkin terlingkup dalam kontainer atau cakupan item:

  • Ekspresi dilingkup kontainer, jika sumber yang mendasar dari ekspresi kontainer adalah ROOT atau container_name. Ekspresi tersebut mewakili sekumpulan item yang diambil dari kontainer secara langsung, dan tidak bergantung pada pemrosesan ekspresi kontainer lainnya.

  • Ekspresi dilingkup item, jika sumber yang mendasar dari ekspresi input_alias kontainer diperkenalkan sebelumnya dalam kueri. Ekspresi seperti itu mewakili sekumpulan item yang diperoleh dengan mengevaluasi ekspresi kontainer. Evaluasi ini dilakukan dalam cakupan setiap item milik set yang terkait dengan kontainer alias. Set yang dihasilkan adalah penyatuan set yang diperoleh dengan mengevaluasi ekspresi kontainer untuk setiap item dalam set yang mendasar.

Contoh

Dalam contoh pertama ini, FROM klausa digunakan untuk menentukan kontainer saat ini sebagai sumber, memberinya nama yang unik, lalu alias. Alias kemudian digunakan untuk memproyeksikan bidang tertentu dalam hasil kueri.

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

Dalam contoh berikutnya ini, FROM klausul juga dapat mengurangi sumber ke subset yang lebih kecil. Untuk menghitung hanya subtree di setiap item, subroot dapat menjadi sumbernya. Array atau subroot objek dapat digunakan sebagai sumber.

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