Пн goose - ввод данных в 2 коллекции за одну транзакцию - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь создать модель Saas, в которой регистрирующийся пользователь создает Company. Поэтому, когда пользователь регистрируется, моя функция должна создать Company и поместить идентификатор компании в ссылку на коллекцию User.

Теперь, если адрес электронной почты пользователя уже зарегистрирован, моя схема mon goose отклоняет эту запись. Я не могу сначала создать User, потому что Company id является обязательным полем для создания User.

Что мне нужно сделать, так это создать эти два документа в разных коллекциях атомарно. Если сохранение User не удается, я хочу прервать эту транзакцию, чтобы она также удалила данные Company.

Вот мой код:

const mSession = await mongoose.startSession();
mSession.startTransaction();
try{        
    var company=new Company({
        name: companyName,
        website: companyWebsite
    });

    company= await company.save();

    this.company= mongoose.Types.ObjectId(company._id);
    this.emailVerificationCode = Random.alphanumeric();
    let user = await this.save();
    await mSession.commitTransaction();
    console.log("User on success:", user);
    return user;
}catch(err){
    await mSession.abortTransaction();
    return false;
}finally{
    mSession.endSession();
}

В этом случае abortTransaction(), похоже, не работает, поскольку данные Company все равно сохраняются.

1 Ответ

1 голос
/ 29 мая 2020

Теперь, если адрес электронной почты пользователя уже зарегистрирован, моя схема mon goose отклоняет эту запись. Я не могу сначала создать пользователя, потому что идентификатор компании является обязательным полем для создания пользователя.

Вы можете сначала создать пользователя и установить для его user.comp_id локально сгенерированный ObjectId:

var mongoose = require('mongoose');
var company_id = mongoose.Types.ObjectId();

var user = new User({
    comp_id: company_id
});

Если электронная почта в порядке и Пользователь правильно сохранен, вы можете создать свою компанию с ее _id устанавливается на локально сгенерированный ObjectId company_id , который был сгенерирован заранее:

var company = new Company({
    _id = company_id,
    name: companyName,
    website: companyWebsite
});
...