Автоинкремент (Auto-increment)
Поле типа Автоинкремент автоматически генерирует последовательные числовые значения для каждой новой записи.
Основные характеристики
- Тип данных: Целое число
- Автогенерация: Автоматически увеличивается при создании записи
- Уникальность: Всегда уникальное значение
- Режим: Только для чтения
- Начальное значение: Настраиваемое
Настройки поля
При создании поля типа "Автоинкремент" доступны следующие настройки:
- Название поля: Отображаемое имя поля
- Системное имя: Уникальный идентификатор для API
- Описание: Подсказка для пользователей
- Начальное значение: С какого числа начинать (по умолчанию 1)
- Шаг: На сколько увеличивать (по умолчанию 1)
- Префикс: Текстовый префикс (например, "INV-")
- Суффикс: Текстовый суффикс
- Минимальная длина: Дополнение нулями слева
Примеры использования
Номер заказа
{
"name": "order_number",
"type": "autoincrement",
"start": 1000,
"step": 1,
"prefix": "ORD-",
"minLength": 6
}
Результат: ORD-001000, ORD-001001, ORD-001002
Номер счета
{
"name": "invoice_number",
"type": "autoincrement",
"start": 1,
"prefix": "INV-",
"suffix": "-2025",
"minLength": 5
}
Результат: INV-00001-2025, INV-00002-2025
Артикул товара
{
"name": "sku",
"type": "autoincrement",
"start": 10000,
"step": 1,
"prefix": "PROD-"
}
Результат: PROD-10000, PROD-10001, PROD-10002
Номер тикета
{
"name": "ticket_number",
"type": "autoincrement",
"start": 1,
"step": 1,
"prefix": "#"
}
Результат: #1, #2, #3
Работа через API
Создание записи
// Поле автоинкремента заполняется автоматически
const order = await emd.database.collection('orders').create({
customer: 'customer_123',
total: 5000
// order_number будет сгенерирован автоматически
});
console.log(order.order_number); // "ORD-001000"
Получение следующего значения
// Узнать следующее значение без создания записи
const nextValue = await emd.database.collection('orders')
.getNextAutoIncrementValue('order_number');
console.log(nextValue); // "ORD-001001"
Поиск по номеру
const order = await emd.database.collection('orders').findOne({
order_number: 'ORD-001000'
});
Форматирование
С префиксом
{
"name": "number",
"type": "autoincrement",
"prefix": "DOC-"
}
Результат: DOC-1, DOC-2, DOC-3
С суффиксом
{
"name": "number",
"type": "autoincrement",
"suffix": "/2025"
}
Результат: 1/2025, 2/2025, 3/2025
С префиксом и суффиксом
{
"name": "number",
"type": "autoincrement",
"prefix": "INV-",
"suffix": "-RU"
}
Результат: INV-1-RU, INV-2-RU, INV-3-RU
С дополнением нулями
{
"name": "number",
"type": "autoincrement",
"prefix": "ORD-",
"minLength": 6
}
Результат: ORD-000001, ORD-000002, ORD-000010, ORD-000100
Начальное значение и шаг
Начать с 1000
{
"name": "number",
"type": "autoincrement",
"start": 1000
}
Результат: 1000, 1001, 1002
Увеличивать на 10
{
"name": "number",
"type": "autoincrement",
"start": 100,
"step": 10
}
Результат: 100, 110, 120, 130
Четные числа
{
"name": "number",
"type": "autoincrement",
"start": 2,
"step": 2
}
Результат: 2, 4, 6, 8
Сброс счетчика
Сброс на начальное значение
await emd.database.collection('orders')
.resetAutoIncrement('order_number');
Установка конкретного значения
await emd.database.collection('orders')
.setAutoIncrementValue('order_number', 5000);
Типичные сценарии использования
Номера заказов
const order = await emd.database.collection('orders').create({
customer: 'customer_123',
items: [...],
total: 10000
});
console.log(`Заказ ${order.order_number} создан`);
// "Заказ ORD-001234 создан"
Номера счетов
const invoice = await emd.database.collection('invoices').create({
order: orderId,
amount: 10000,
due_date: '2025-12-31'
});
console.log(`Счет ${invoice.invoice_number}`);
// "Счет INV-00567-2025"
Артикулы товаров
const product = await emd.database.collection('products').create({
name: 'Новый товар',
price: 1000
});
console.log(`Артикул: ${product.sku}`);
// "Артикул: PROD-10234"
Номера тикетов поддержки
const ticket = await emd.database.collection('support_tickets').create({
user: userId,
subject: 'Проблема с оплатой',
description: '...'
});
console.log(`Тикет ${ticket.ticket_number} создан`);
// "Тикет #1234 создан"
Индексация
// Создать уникальный индекс для быстрого поиска
await emd.database.collection('orders').createIndex({
order_number: 1
}, {
unique: true
});
Сортировка
// Сортировка по номеру (от новых к старым)
const orders = await emd.database.collection('orders')
.find()
.sort({ order_number: -1 });
// Сортировка по номеру (от старых к новым)
const orders = await emd.database.collection('orders')
.find()
.sort({ order_number: 1 });
Поиск и фильтрация
Поиск по номеру
const order = await emd.database.collection('orders').findOne({
order_number: 'ORD-001234'
});
Поиск по диапазону
const orders = await emd.database.collection('orders').find({
order_number: {
$gte: 'ORD-001000',
$lte: 'ORD-002000'
}
});
Последние N записей
const latestOrders = await emd.database.collection('orders')
.find()
.sort({ order_number: -1 })
.limit(10);
Отображение в интерфейсе
Ссылка на запись
const order = await emd.database.collection('orders').get(orderId);
const orderLink = `
<a href="/orders/${order.id}">
Заказ ${order.order_number}
</a>
`;
Копирование номера
function copyOrderNumber(orderNumber) {
navigator.clipboard.writeText(orderNumber);
showNotification(`Номер ${orderNumber} скопирован`);
}
Миграция данных
Установка начального значения при миграции
// Найти максимальное значение в существующих данных
const maxOrder = await emd.database.collection('orders')
.find()
.sort({ old_number: -1 })
.limit(1);
if (maxOrder.length > 0) {
await emd.database.collection('orders')
.setAutoIncrementValue('order_number', maxOrder[0].old_number + 1);
}
Рекомендации
- Используйте автоинкремент для пользовательских номеров (заказы, счета, тикеты)
- Не используйте для первичных ключей (используйте ObjectId или UUID)
- Добавляйте префиксы для разных типов документов
- Используйте минимальную длину для единообразия
- Создавайте уникальный индекс для быстрого поиска
- Не изменяйте значения вручную
- Документируйте формат номеров
Ограничения
- Нельзя изменить значение вручную (только для чтения)
- В распределенных системах могут быть пропуски в последовательности
- При удалении записи номер не используется повторно
- Максимальное значение ограничено типом integer
Отличие от других типов
- Auto-increment vs Number: Auto-increment генерируется автоматически и уникален
- Auto-increment vs ObjectId: Auto-increment читаем человеком, последовательный
- Auto-increment vs UUID: Auto-increment короче, последовательный, предсказуемый