Поделиться через


Предложение FROM (запрос NoSQL)

ОБЛАСТЬ ПРИМЕНЕНИЯ: NoSQL

Предложение FROM (FROM <from_specification>) является необязательным, если далее в запросе источник не фильтруется и не отображается. Запрос, например SELECT * FROM products перечисление по всему контейнеру, независимо от имени. Кроме того, можно использовать специальный идентификатор ROOT для контейнера вместо использования имени контейнера.

Предложение FROM применяет следующие правила для каждого запроса:

  • Контейнер может иметь псевдоним, например SELECT p.id FROM products AS p или просто SELECT p.id FROM products p. p Ниже приведен псевдоним контейнера. Контейнер не обязательно должен называться products или p. AS — необязательное ключевое слово для псевдонима идентификатора.
  • После псевдонима исходное имя источника не может быть привязано. Например, выражение SELECT products.id FROM products p является синтаксически недопустимым, так как идентификатор products уже имеет псевдоним и не может быть разрешен.
  • Все свойства, на которые указывают ссылки, должны быть полными, чтобы избежать неоднозначных привязок в отсутствие строгого соответствия схемам. Например, выражение SELECT id FROM products p является синтаксически недопустимым, так как свойство id не привязано. Вместо этого запрос должен ссылаться на свойство id с помощью p.id (или <alias>.<property-name>).

Синтаксис

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

Аргументы

Description
<from_source> Указывает источник данных с псевдонимом или без него. Если псевдоним не указан, он выводится из <container_expression> следующих правил. Если выражение является псевдонимом container_name, container_name то используется в качестве псевдонима. Если выражение имеет значение <container_expression>, то property_name используется в качестве псевдонима. Если выражение является псевдонимом container_name, container_name то используется в качестве псевдонима.
КАК input_alias Указывает, что аргумент input_alias — это набор значений, возвращенный базовым выражением контейнера.
input_alias В Указывает, что аргумент input_alias должен представлять набор значений, полученных путем итерации всех элементов в каждом массиве, возвращенном базовым выражением контейнера. Любое значение, возвращаемое базовым выражением контейнера, которое не является массивом, игнорируется.
<container_expression> Указывает выражение контейнера, используемое для извлечения элементов.
ROOT Указывает, что элемент должен быть получен из контейнера по умолчанию, подключенного в данный момент.
container_name Указывает, что элемент должен быть извлечен из предоставленного контейнера. Имя этого контейнера должно совпадать с именем подключенного в настоящий момент контейнера.
input_alias Указывает, что элемент должен быть получен из другого источника, определенного указанным псевдонимом.
<container_expression> '.' property_name Указывает, что элемент должен быть получен путем доступа к свойству property_name .
<container_expression> '[' "property_name" \| array_index ']' Указывает, что элемент должен быть получен путем доступа к свойству или array_index элементу property_name массива для всех элементов, полученных указанным выражением контейнера.

Замечания

Все псевдонимы, предоставленные или выведенные в аргументе <from_source>, должны быть уникальными. Синтаксис <container_expression> '.' property_name аналогичен синтаксису <container_expression> '[' "property_name" ']'. Однако последний синтаксис можно использовать, если имя свойства содержит символ неидентификатора.

Обработка отсутствующих свойств, элементов массива и неопределенных значений

Если выражение контейнера обращается к свойствам или элементам массива, и это значение не существует, это значение игнорируется и не обрабатывается дальше.

Определение области контекста выражения контейнера

Выражение контейнера может быть областью действия контейнера или областью действия элемента:

  • Выражение является областью действия контейнера, если базовый источник выражения контейнера либоROOT.container_name Такое выражение представляет набор элементов, извлеченных из контейнера напрямую, и не зависит от обработки других выражений контейнера.

  • Выражение является областью действия элемента, если базовый источник выражения контейнера представлен input_alias ранее в запросе. Такое выражение представляет набор элементов, полученных при оценке выражения контейнера. Эта оценка выполняется в области каждого элемента, относящегося к набору, связанному с псевдонимом контейнера. Результирующий набор представляет собой объединение наборов, полученных путем оценки выражения контейнера для каждого элемента в базовом наборе.

Примеры

В этом первом примере FROM предложение используется для указания текущего контейнера в качестве источника, присвоения ему уникального имени, а затем псевдонима. Затем псевдоним используется для проекта определенных полей в результатах запроса.

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

В следующем примере FROM предложение также может уменьшить источник до меньшего подмножества. Чтобы перечислить только поддерев в каждом элементе, вложенный элемент может стать источником. Массив или вложенный объект можно использовать в качестве источника.

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