JSON
Поле типа JSON используется для хранения структурированных данных в формате JSON (JavaScript Object Notation).
Основные характеристики
- Тип данных: JSON объект или массив
- Максимальный размер: До 16 МБ
- Валидация: Автоматическая проверка корректности JSON
- Вложенность: Поддержка любого уровня вложенности
Когда использовать JSON
JSON поля идеально подходят для:
- Динамических структур данных с переменным набором полей
- Конфигураций и настроек приложений
- Метаданных с произвольной структурой
- API ответов от внешних сервисов
- Сложных объектов, которые не требуют отдельных полей
Настройки поля
При создании поля типа "JSON" доступны следующие настройки:
- Название поля: Отображаемое имя поля
- Системное имя: Уникальный идентификатор для API
- Описание: Подсказка для пользователей
- Обязательное поле: Требовать заполнения
- Значение по умолчанию: JSON объект или массив по умолчанию
- Схема валидации: JSON Schema для проверки структуры (опционально)
Примеры использования
Настройки пользователя
{
"name": "preferences",
"type": "json",
"default": {
"theme": "light",
"language": "ru",
"notifications": {
"email": true,
"push": false
}
}
}
Адрес
{
"name": "address",
"type": "json",
"default": {
"country": "",
"city": "",
"street": "",
"building": "",
"apartment": "",
"zipCode": ""
}
}
Метаданные товара
{
"name": "metadata",
"type": "json",
"default": {}
}
Характеристики товара
{
"name": "specifications",
"type": "json",
"default": {
"dimensions": {
"width": 0,
"height": 0,
"depth": 0,
"unit": "cm"
},
"weight": {
"value": 0,
"unit": "kg"
},
"materials": []
}
}
Работа через API
Создание записи
const record = await emd.database.collection('users').create({
name: 'Иван Иванов',
preferences: {
theme: 'dark',
language: 'ru',
notifications: {
email: true,
push: true,
sms: false
}
}
});
Чтение JSON поля
const record = await emd.database.collection('users').get(recordId);
console.log(record.preferences.theme); // 'dark'
console.log(record.preferences.notifications.email); // true
Обновление всего объекта
await emd.database.collection('users').update(recordId, {
preferences: {
theme: 'light',
language: 'en',
notifications: {
email: false,
push: true,
sms: false
}
}
});
Обновление вложенного поля
// Обновить только тему, сохранив остальные настройки
const record = await emd.database.collection('users').get(recordId);
await emd.database.collection('users').update(recordId, {
preferences: {
...record.preferences,
theme: 'dark'
}
});
// Или используя точечную нотацию (если поддерживается)
await emd.database.collection('users').update(recordId, {
'preferences.theme': 'dark'
});
Добавление элемента в массив
const record = await emd.database.collection('products').get(recordId);
const specs = record.specifications;
specs.materials.push('Алюминий');
await emd.database.collection('products').update(recordId, {
specifications: specs
});
Поиск по JSON полям
Поиск по вложенному полю
// Найти пользователей с темной темой
const users = await emd.database.collection('users').find({
'preferences.theme': 'dark'
});
// Найти пользователей с включенными email уведомлениями
const users = await emd.database.collection('users').find({
'preferences.notifications.email': true
});
Проверка существования поля
const records = await emd.database.collection('products').find({
'specifications.dimensions': { $exists: true }
});
Валидация с JSON Schema
Вы можете определить схему для валидации структуры JSON:
{
"name": "address",
"type": "json",
"schema": {
"type": "object",
"required": ["country", "city"],
"properties": {
"country": { "type": "string" },
"city": { "type": "string" },
"street": { "type": "string" },
"building": { "type": "string" },
"apartment": { "type": "string" },
"zipCode": { "type": "string", "pattern": "^\\d{6}$" }
}
}
}
Примеры сложных структур
Корзина покупок
{
items: [
{
productId: "prod_123",
name: "Ноутбук",
quantity: 1,
price: 89990,
options: {
color: "Серебристый",
memory: "16GB"
}
},
{
productId: "prod_456",
name: "Мышь",
quantity: 2,
price: 1990
}
],
total: 93970,
currency: "RUB"
}
История изменений
{
changes: [
{
timestamp: "2025-11-25T10:30:00Z",
user: "user_123",
field: "status",
oldValue: "В работе",
newValue: "Завершена"
},
{
timestamp: "2025-11-25T11:15:00Z",
user: "user_456",
field: "priority",
oldValue: "Средний",
newValue: "Высокий"
}
]
}
Конфигурация виджета
{
type: "chart",
config: {
chartType: "line",
dataSource: "sales_collection",
xAxis: "date",
yAxis: "revenue",
filters: {
status: "completed",
dateRange: {
from: "2025-01-01",
to: "2025-12-31"
}
},
styling: {
colors: ["#3b82f6", "#ef4444"],
showLegend: true,
showGrid: true
}
}
}
Отображение в интерфейсе
В админ-панели JSON поля отображаются:
- Компактный вид: Однострочное представление для таблиц
- Развернутый вид: Форматированный JSON с подсветкой синтаксиса
- Редактор: Monaco Editor или аналогичный для редактирования
- Древовидный вид: Для удобной навигации по структуре
Рекомендации
Когда использовать JSON
- ✅ Динамические структуры с переменным набором полей
- ✅ Настройки и конфигурации
- ✅ Временное хранение данных из внешних API
- ✅ Метаданные с произвольной структурой
Когда НЕ использовать JSON
- ❌ Данные, по которым нужен частый поиск (создайте отдельные поля)
- ❌ Данные, которые нужно агрегировать (используйте числовые поля)
- ❌ Связи между записями (используйте тип Relation)
- ❌ Большие объемы данных (используйте отдельную коллекцию)
Лучшие практики
- Определяйте схему валидации для критичных данных
- Документируйте структуру JSON в описании поля
- Используйте значения по умолчанию для обязательных полей
- Избегайте глубокой вложенности (максимум 3-4 уровня)
- Не храните файлы или большие бинарные данные в JSON
- Используйте понятные имена ключей
- Поддерживайте консистентность структуры между записями
Ограничения
- Максимальный размер: 16 МБ
- Поиск по вложенным полям может быть медленнее обычных полей
- Нет автоматической индексации вложенных полей
- Сложнее валидировать и поддерживать целостность данных
Отличие от других типов
- JSON vs String: JSON обеспечивает структуру и валидацию
- JSON vs Relation: JSON для произвольных данных, Relation для связей между коллекциями
- JSON vs отдельные поля: JSON для динамических структур, отдельные поля для фиксированной схемы