Mongoose: удаление ссылочных ObjectIds с помощью ловушки deleteMany - PullRequest
0 голосов
/ 04 ноября 2019

Моя схема выглядит следующим образом:

const Author = new Schema({
    name: String,
    posts: [{ type: mongoose.Schema.Types.ObjectId, ref: "Post" }]
});

const Post = new Schema({
    text: String,
    author: { type: mongoose.Schema.Types.ObjectId, ref: "Author" }
});

Если я использую deleteMany() для удаления группы сообщений, каков наилучший способ удаления записей ObjectId из объекта Author?

Я попытался использовать предварительный хук deleteMany, однако он передает только то, сколько документов удалено, а не фактические ObjectIds сообщений.

1 Ответ

0 голосов
/ 05 ноября 2019

Вы можете создать объект запроса, который используется для deleteMany, и вместо этого использовать его для запроса документов через find. Это даст вам все целевые документы, которые вы затем сможете удалить с помощью deleteMany.

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

Пример в машинописном тексте:

  const queryObj = { foo: 'bar' };
  const postsCollection = mongoDb.getCollection<{ _id: ObjectId }>('posts');
  const postsToDelete = await postsCollection.find(queryObj).toArray();
  const deleteManyResult = await postsCollection.deleteMany(queryObj);

  if (deleteManyResult.deletedCount === postsToDelete.length) {
    for (const deletedPost of postsToDelete) {
      // delete from author
    }
  } else {
    for (const potentiallyDeletedPost of postsToDelete) {
      const post = await postsCollection.findOne({ _id: potentiallyDeletedPost._id });
      if (!post) {
        // delete from author
      } else {
        // handle non-deleted post
      }
    }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...