Soft deletes (мягкое удаление) позволяет пометить записи как удалённые без их физического удаления, что даёт возможность восстановить данные и вести логи изменений.
Вместо удаления документа добавь поле deletedAt с текущей меткой времени:
{
"_id": "...",
"name": "Example",
"deletedAt": ISODate("2024-01-15T10:00:00Z")
}
Для активных (не удалённых) документов это поле должно быть null или отсутствовать полностью.
Создай partial index для эффективных запросов к активным документам:
db.collection.createIndex(
{ name: 1 },
{ partialFilterExpression: { deletedAt: null } }
)
Такой индекс охватывает только активные записи, что уменьшает размер индекса и улучшает производительность.
Используй TTL (Time-To-Live) индекс для автоматического удаления мягко удалённых документов по истечении периода хранения:
db.collection.createIndex(
{ deletedAt: 1 },
{ expireAfterSeconds: 2592000 } // 30 days
)
Каждый запрос должен явно исключать удалённые записи, чтобы они не появлялись в результатах:
db.collection.find({ deletedAt: null })
Подумай о централизации этой логики в repository layer или middleware, чтобы случайно не выдать удалённые данные.
Частичный индекс с partialFilterExpression: { deletedAt: null } уменьшает размер индекса, индексируя только активные документы, что делает запросы к неудалённым записям более эффективными.
Новый — ещё не проверен сообществом
Вы