Реализация мягкого удаления в TypeScript, Mongoose и Node.js: подробное руководство

Мягкое удаление — это распространенный метод, используемый в системах баз данных для пометки записей как «удаленных» вместо физического удаления их из базы данных. Он обеспечивает способ сохранить целостность данных, сохраняя при этом возможность восстановления или запроса удаленных записей при необходимости. В этой статье мы рассмотрим различные методы реализации обратимого удаления в TypeScript, Mongoose и Node.js, а также приведем примеры кода.

Метод 1: подход с логическим флагом
Один из самых простых способов реализовать обратимое удаление — добавить в схему логический флаг, указывающий, удалена запись или нет. Вот пример:

import { Schema, model, Types } from 'mongoose';
const UserSchema = new Schema({
  name: { type: String, required: true },
  isDeleted: { type: Boolean, default: false },
});
const User = model('User', UserSchema);
// Soft delete a user
async function softDeleteUser(userId: string) {
  await User.updateOne({ _id: userId }, { isDeleted: true });
}
// Retrieve all non-deleted users
async function getActiveUsers() {
  return User.find({ isDeleted: false });
}

Метод 2: использование временных меток.
Другой подход заключается в использовании временных меток для отслеживания момента удаления записи. Этот метод предполагает добавление в схему двух дополнительных полей: deletedAtдля хранения отметки времени удаления и isDeletedдля указания того, удалена запись или нет. Вот пример:

import { Schema, model, Types } from 'mongoose';
const UserSchema = new Schema({
  name: { type: String, required: true },
  deletedAt: { type: Date, default: null },
  isDeleted: { type: Boolean, default: false },
});
const User = model('User', UserSchema);
// Soft delete a user
async function softDeleteUser(userId: string) {
  await User.updateOne({ _id: userId }, { deletedAt: new Date(), isDeleted: true });
}
// Retrieve all non-deleted users
async function getActiveUsers() {
  return User.find({ isDeleted: false });
}

Метод 3: виртуальный подход
Используя виртуальные возможности в Mongoose, мы можем создать виртуальное свойство, которое автоматически отфильтровывает удаленные записи. Вот пример:

import { Schema, model, Types } from 'mongoose';
const UserSchema = new Schema({
  name: { type: String, required: true },
  isDeleted: { type: Boolean, default: false },
});
UserSchema.virtual('activeUsers').get(function () {
  return this.model('User').find({ isDeleted: false });
});
const User = model('User', UserSchema);
// Soft delete a user
async function softDeleteUser(userId: string) {
  await User.updateOne({ _id: userId }, { isDeleted: true });
}
// Retrieve all non-deleted users using virtual property
async function getActiveUsers() {
  const users = await User.find().populate('activeUsers');
  return users.activeUsers;
}

В этой статье мы рассмотрели три различных метода реализации обратимого удаления в TypeScript, Mongoose и Node.js. Подход с логическим флагом, подход с меткой времени и подход с виртуальными функциями имеют свои преимущества и недостатки. В зависимости от вашего конкретного случая использования вы можете выбрать метод, который лучше всего соответствует вашим потребностям. Обратимое удаление – это мощный способ обработки удалений, сохраняющий целостность данных и позволяющий легко восстановить их при необходимости.