Удалите документы из разных коллекций в MongoDB из NodeJS для обеспечения согласованности базы данных - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть эти коллекции: статьи, избранное и комментарии. Я хочу удалить статью, а вместе с ней удалить ее комментарии и избранное.

Мой код:

        //delete comments
        await this.commentsService.deleteArticleComments(articleId);

        //delete favorites
        await this.favoritesService.deleteArticleFavorites(articleId);

        //delete article
        await this.articlesService.deleteArticle(articleId);

Каждый вызывает метод в службе, который выполняет удаление с Пн goose:

async deleteArticleComments(articleId: string){
    return await this.commentModel.deleteMany({articleId}).exec();
}

Лог c работает, но меня беспокоит, что если шаг «Избранное» или «Комментарий» завершится неудачно, статья не будет удалена, а база данных потеряет свою согласованность.

Есть ли способ вызвать эти 3 действия удаления и выполнить все из них сразу? И если есть ошибка, все они должны быть отменены.

1 Ответ

0 голосов
/ 23 апреля 2020

Я решил так:

    const session = await this.articleModel.collection.conn.startSession();
    session.startTransaction();
    try {
        //delete comments
        await this.commentModel.deleteMany({articleId});
        //delete favorites
        await this.favoriteModel.deleteMany({articleId});
        //delete article
        await this.articleModel.deleteOne({"_id": articleId});

        await session.commitTransaction();
    } catch (error) {
        // If an error occurred, abort the whole transaction and
        // undo any changes that might have happened
        await session.abortTransaction();
        throw new HttpException('Error deleting article', HttpStatus.BAD_REQUEST);
    } finally {
        session.endSession();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...