Простая выборка данных и выборка с условием

Простая выборка данных

Простая выборка используется для поиска и вывода данных из неймспейса БД без условий. Пример:

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}