Перейти к основному содержимому

Синтаксис и знаки препинания в NoSQL-запросах

Разработчику Аналитику Тестировщику
Архитектору Инженеру

Перед чтением: Операторы — общие понятия оператора, операнда, приоритетов и типов операций; здесь те же идеи в синтаксисе запросов.

В NoSQL нет единого языка, как SQL для реляционных СУБД. Один и тот же продукт может принимать JSON (REST API), текстовый протокол (Redis), SQL-подобный диалект (CQL) или графовый язык (Cypher). Ниже — правила по основным форматам раздела.


JSON (REST API, тела запросов, экспорт)

Используется в HTTP API MongoDB Atlas, CouchDB, многих облачных сервисах и при обмене данными между сервисами.

  • Только двойные кавычки для ключей и строк.
  • Разделитель полей — запятая; точка с запятой запрещена.
  • Trailing comma (запятая после последнего элемента) — ошибка в строгих парсерах.
  • Точка . в JSON не является оператором; путь к вложенному полю в API задаётся отдельным синтаксисом движка (в MongoDB — "address.city" в фильтре, не в чистом JSON).
{
"name": "Джайна",
"quote": "Я в порядке.",
"tags": ["mage", "alliance"]
}

Одинарные кавычки снаружи строки недопустимы. Апостроф внутри строки допустим: "quote": "It's fine".


MongoDB shell (mongosh) и BSON

Оболочка mongosh — это JavaScript: объекты фильтра и обновления можно писать без кавычек у ключей, если имя — валидный идентификатор.

// Допустимо в mongosh:
db.users.find({ status: "active", age: { $gte: 18 } })

// Вложенные поля — точка в строке ключа или объект:
db.users.find({ "address.city": "Москва" })
db.users.updateOne(
{ _id: 1 },
{ $set: { "profile.bio": "разработчик" } }
)

Отличия от "чистого" JSON:

ПравилоJSONmongosh
Ключи без кавычекНетДа ({ name: "Ann" })
Комментарии //НетДа
Тип DateНетISODate("2025-01-15")
undefined в документеПоле не сохраняется при insert

Extended JSON (экспорт, Atlas API, mongoimport) — типы BSON кодируют объектами $oid, $date, $numberDecimal:

{ "_id": { "$oid": "507f191e810c19729de860ea" }, "createdAt": { "$date": "2025-01-15T00:00:00.000Z" } }

Операторы обновления и запроса начинаются с $$set, $inc, $gte, $match (в агрегации). Точка в $ не разделяет путь — путь к полю в кавычках: "items.0.qty".

Команды завершаются точкой с запятой по желанию (как в JS). Несколько операций подряд — без BEGIN/COMMIT (транзакции — отдельный API с session).


Redis (протокол RESP)

Клиент отправляет массив строк в формате RESP (Redis Serialization Protocol). В redis-cli это выглядит как команда и аргументы через пробел; строковые значения с пробелами — в кавычках.

SET user:42 "{\"name\":\"Ann\"}"
GET user:42
EXPIRE user:42 300
HSET cart:42 item_id 7 qty 2
  • Регистр команд в документации — ВЕРХНИЙ (SET); сервер принимает и set.
  • Нет SELECT … WHERE по полям внутри значения — только по имени ключа (RediSearch / Redis Stack — отдельно).
  • Точка с запятой не завершает команду.
  • Pipeline — пакет команд для RTT; MULTIEXEC — атомарный блок. См. справочник.
  • Условная запись — SET key val NX, отдельной команды CAS нет.

CQL (Apache Cassandra)

CQL (Cassandra Query Language) напоминает SQL, но семантика другая — нет JOIN, ограниченные UPDATE/DELETE, обязательный partition key в WHERE.

Код ITЗагрузка примера кода…

ЭлементПравило
Ключевые словаРегистр не важен; в примерах пишут SELECT, PRIMARY KEY
ИдентификаторыБуквы, цифры, _; зарезервированные слова — в двойных кавычках
СтрокиОдинарные кавычки 'text'
ЗавершениеТочка с запятой ; обязательна
Литералыuuid(), now(), toTimestamp(...)

Запрос без полного partition key в WHERE либо отклоняется, либо приводит к полному скану кластера (ALLOW FILTERING — только для отладки).

Подробнее о проектировании ключей: Cassandra.


Cypher (Neo4j и совместимые)

Декларативный язык паттернов графа: узлы (), связи -[..]->.

CREATE (a:User { name: 'Анна' })-[:FOLLOWS]->(b:User { name: 'Борис' });
MATCH (u:User { name: 'Анна' })-[:FOLLOWS*1..2]->(friend)
RETURN friend.name;
ЭлементПравило
Метки узлов:User после скобок
Тип связи:FOLLOWS, :KNOWS в квадратных скобках
Свойства{ key: 'value' } — строки чаще в одинарных кавычках
Переменныеu, friend — латиница, без пробелов
ЗавершениеТочка с запятой ; в конце запроса
Комментарии// до конца строки

Глубина обхода: -[*1..3]- — от 1 до 3 рёбер. Алгоритмы вроде PageRank — отдельные библиотеки (Neo4j GDS), не базовый Cypher.

Справочник: Cypher.


Частые ошибки парсера

ОшибкаГде проявляетсяКак исправить
Одинарные кавычки снаружи объектаJSON, строгие APIЗаменить на "
Trailing commaJSONУбрать последнюю запятую
$set без объектаMongoDB{ $set: { field: value } }
SELECT * WHERE status = 'x' без partition keyCassandraПерепроектировать таблицу или lookup
Ожидание CAS как командыRedisSET key val NX или WATCH + MULTI
Путать JSON и BSON типыMongoDBДаты — ISODate, id — ObjectId(...)

Сводка — чем заканчиется команда

СистемаРазделитель полейЗавершение команды
JSONзапятаянет ;
mongoshзапятая в объектах; опционально
Redis RESPпробел / бинарный протоколперевод строки
CQLзапятая в списках;
Cypherзапятая в списках;

При сомнении смотрите официальный пример для конкретной СУБД: синтаксис из MongoDB не переносится в CQL или Cypher без изменений.


Основа по протоколу

Базовый разбор HTTP и HTTPS находится в отдельной статье — HTTP как основа веб-интеграций.