Синтаксис и знаки препинания в 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:
| Правило | JSON | mongosh |
|---|---|---|
| Ключи без кавычек | Нет | Да ({ 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;
MULTI…EXEC— атомарный блок. См. справочник. - Условная запись —
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 comma | JSON | Убрать последнюю запятую |
$set без объекта | MongoDB | { $set: { field: value } } |
SELECT * WHERE status = 'x' без partition key | Cassandra | Перепроектировать таблицу или lookup |
Ожидание CAS как команды | Redis | SET key val NX или WATCH + MULTI |
| Путать JSON и BSON типы | MongoDB | Даты — ISODate, id — ObjectId(...) |
Сводка — чем заканчиется команда
| Система | Разделитель полей | Завершение команды |
|---|---|---|
| JSON | запятая | нет ; |
| mongosh | запятая в объектах | ; опционально |
| Redis RESP | пробел / бинарный протокол | перевод строки |
| CQL | запятая в списках | ; |
| Cypher | запятая в списках | ; |
При сомнении смотрите официальный пример для конкретной СУБД: синтаксис из MongoDB не переносится в CQL или Cypher без изменений.
Базовый разбор HTTP и HTTPS находится в отдельной статье — HTTP как основа веб-интеграций.