Простая выборка данных и выборка с условием
Простая выборка данных
Простая выборка используется для поиска и вывода данных из неймспейса БД без условий. Пример:
query := db.Query("test_namespace")
SELECT * FROM test_namespace
curl --location --request POST 'http://127.0.0.1:9088/api/v1/db/testdb/query' \
--header 'Content-Type: application/json' \
--data-raw '{
"namespace": "test_namespace",
"type": "select"
}'
Выборка данных с условиями
Для выборки данных с условиям в Reindexer совместно с оператором SELECT
используется ключевое слово WHERE
.
Можно использовать выражения с общими операторами сравнения (в SQL-запросах) и операторами сравнения значений (при взаимодействии с БД через коннекторы):
В SQL-запросах на выборку данных можно использовать следующие операторы:
Оператор | Описание/пояснение |
---|---|
= |
Равно |
> |
Больше |
< |
Меньше |
>= |
Больше или равно |
<= |
Меньше или равно |
<> |
Не равно |
IN |
Определяет набор значений, с которым будут сравниваться результаты при выборке |
RANGE |
Определяет диапазон значений, которые будут использоваться при выборке |
LIKE |
Поиск по заданному шаблону. Подробнее об операторе – в разделе Простой поиск |
IS NULL |
Значение не задано |
IS NOT NULL |
Задано какое-либо значение |
ST_DWithin |
Получение объектов, находящихся на определенном расстоянии от других объектов (только для геометрического типа данных) |
В запросах на выборку данных при взаимодействии с Reindexer через Go-коннектор можно использовать следующие операторы и методы:
Оператор | Описание/пояснение |
---|---|
EQ |
Равно |
GT |
Больше |
LT |
Меньше |
GE |
Больше или равно |
LE |
Меньше или равно |
SET |
Проверяет значение в наборе значений, разделенных запятыми, и извлекает соответствующие строки из неймспейса. Также позволяет проверить, есть ли у массивов общие элементы |
ALLSET |
Проверяет значение в наборе значений, разделенных запятыми, и извлекает соответствующие строки из неймспейса. Также позволяет проверить, есть ли у массивов общие элементы, при этом все элементы первого массива должны входить во второй |
RANGE |
Определяет диапазон значений, которые будут использоваться при выборке |
ANY |
Любое значение |
EMPTY |
Пустое значение (в том числе и массив нулевой длины) |
LIKE |
Поиск по заданному шаблону. Подробнее об операторе – в разделе Простой поиск |
ST_DWithin() |
Получение объектов, находящихся на определенном расстоянии от других объектов (только для геометрического типа данных) |
Match() |
Запросы к полнотекстовым индексам. Подробнее — в разделе Запросы к полнотекстовым индексам |
Not() |
Логическое отрицание для любого следующего оператора |
Условия можно комбинировать с помощью логических операторов OR
и AND
.
При этом операции с
OR
имеют более высокий приоритет, чемAND
. Например, условие видаWHERE a AND b OR c AND d
эквивалентноWHERE a AND (b OR c) AND d
.
Также Reindexer поддерживает условия с фильтрацией при помощи сравнения полей одного и того же документа.
Пример запроса с одним условием:
query := db.Query("test_namespace").
Where("year", reindexer.EQ, 2022)
SELECT * FROM test_namespace WHERE year = 2022
curl --location --request POST 'http://127.0.0.1:9088/api/v1/db/testdb/query' \
--header 'Content-Type: application/json' \
--data-raw '{
"namespace": "test_namespace",
"type": "select",
"filters": [
{
"field": "year",
"cond": "EQ",
"value": 2022
}
]
}'
Пример запроса с несколькими условиями:
query := db.Query("test_namespace").
Where("year", reindexer.QE, 2022).
Where("price", reindexer.LE, 1000)
SELECT * FROM test_namespace WHERE year = 2022 AND price <= 1000
curl --location --request POST 'http://127.0.0.1:9088/api/v1/db/testdb/query' \
--header 'Content-Type: application/json' \
--data-raw '{
"namespace": "test_namespace",
"type": "select",
"filters": [
{
"field": "year",
"cond": "EQ",
"value": 2022
},
{
"field": "price",
"cond": "LE",
"value": 1000
}
]
}'
Пример запроса с использованием условного оператора LIKE
:
query := db.Query("test_namespace").
Where("field_description", reindexer.LIKE, "info%")
SELECT * FROM test_namespace WHERE field_description LIKE 'info%'
curl --location --request POST 'http://127.0.0.1:9088/api/v1/db/testdb/query' \
--header 'Content-Type: application/json' \
--data-raw '{
"namespace": "test_namespace",
"type": "select",
"filters": [
{
"field": "name",
"cond": "LIKE",
"value": "info%"
}
]
}'
LIKE
использует метод полного сканирования поля и его применение ведет к увеличению нагрузки на сервер. Для полнотекстового поиска с высокой скоростью рекомендуется использовать полнотекстовые индексы.
Пример запроса с фильтрацией при помощи сравнения полей одного и того же документа:
В Go-коннекторе для запросов с фильтрацией при помощи сравнения полей одного и того документа используется метод WhereBetweenFields()
.
query := db.Query("test_namespace").
WhereBetweenFields("price", reindexer.GE, "recommended_price")
В SQL-запросах имена индексов (полей неймспейсов) должны быть указаны в двойных кавычках. При указании в одинарных кавычках они будут восприниматься как строки.
SELECT * FROM test_namespace WHERE "recommended_price" > "price"
curl --location --request POST 'http://127.0.0.1:9088/api/v1/db/testdb/query' \
--header 'Content-Type: application/json' \
--data-raw '{
"namespace": "test_namespace",
"type": "select",
"filters": [
{
"first_field": "recommended_price",
"cond": "LE",
"second_field": "price"
}
]
}'
Пример запроса для выборки из композитного индекса:
query := db.Query("test_namespace").WhereComposite("price+year", reindexer.EQ,[]interface{}{10000,2022})
Имя композитного индекса необходимо передавать в кавычках, а требуемые значения — в фигурных скобках.
SELECT * FROM test_namespace WHERE "price+year" = {10000, 2022}