У меня есть документ Project с массивом вложенных документов, со схемой Tasks. Задачи имеет массив вложенных документов со схемой комментариев.

const projectSchema = new Schema({
  _id: Schema.Types.ObjectId,
  name: { type: String, required: true, unique: true },
  description: { type: String, default: '' },
  tasks: [{ type: Schema.Types.ObjectId, ref: 'Threads' }]
});
module.exports = mongoose.model('Project', projectSchema);

const tasksSchema = new Schema({
  projectId: { type: Schema.Types.ObjectId },
  _id: Schema.Types.ObjectId,
  title: { type: String, required: true },
  text: { type: String, required: true },
  comments: [{ type: Schema.Types.ObjectId, ref: 'Replies' }]
})
module.exports = mongoose.model('Tasks', tasksSchema);

const commentSchema = new Schema({
  taskId: { type: Schema.Types.ObjectId },
  _id: Schema.Types.ObjectId,
  text: { type: String, required: true }
})
module.exports = mongoose.model('Comment', commentSchema);

Когда я удаляю документ проекта, я хочу удалить каждую задачу и каждый комментарий, относящийся к этому проекту. Для удаления проекта я использую findOneAndDelete, поэтому я установил промежуточное программное обеспечение для удаления всех задач.

projectSchema.post('findOneAndDelete', function(doc, next) {
  mongoose.model('Tasks').deleteMany({ projectId: doc._id }).exec(); 
  next();
})

Но теперь я не знаю, как удалить каждый комментарий, потому что deletemany возвращает объект с результатом операции. Должен ли я сопоставить массив задач и каждый раз вызывать findOneAndDelete, а затем удалять каждый комментарий? Это выглядит очень неэффективно для многих задач.

2
AskaNor_29 20 Дек 2019 в 17:23

1 ответ

Лучший ответ

Как насчет встраивания комментариев в пост? так как его отношение один ко многим (не огромное). Таким образом, в своем коде, где вы удаляете проект, вы сначала удаляете все сообщения, которые содержат все комментарии, только после успешного удаления вы удаляете проект. Это также значительно повысит производительность чтения, поскольку вам нужно будет вернуть только один документ, а не несколько документов (1 пост + много комментариев).

Вложение поста в проект также возможно, но в зависимости от размера и количества возможных постов, вероятно, лучше хранить его как отдельный документ. В этом случае вам нужна логика для обеспечения согласованности. Здесь вы можете использовать новую функцию mongodb - транзакцию. Но я думаю, что для этого случая транзакция не нужна. (Также я считаю ее довольно нестабильной на данный момент). Вы можете использовать метод «возможной согласованности».

По сути, вы просто удаляете все сообщения, связанные с проектом, а затем удаляете проект. А затем вы запускаете пакеты, чтобы проверить наличие несоответствий (проверьте, есть ли посты, где его проект не существует. Если он не существует, удалите посты)

1
Sihoon Kim 22 Дек 2019 в 03:38