Предложение 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"
}
]