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

Автоинкремент (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 короче, последовательный, предсказуемый