猫鼬-使模型与更改保持关联

时间:2019-08-29 23:13:42

标签: javascript node.js mongoose

当我有两个模式并且它们互相引用时:

    const SchemaA = new Schema({
        _schemaB: [{
            type: Schema.Types.ObjectId,
            ref: 'SchemaA'
        }]
    });

    const SchemaB = new Schema({
        _schemaA: {
            type: Schema.Types.ObjectId,
            ref: 'SchemaB'
        }
    });

    mongoose.model('SchemaA', SchemaA);
    mongoose.model('SchemaB', SchemaB);

每次创建SchemaB类型的文档时,都需要将其添加到SchemaA的集合中以保持更新。

要实现它,我在SchemaB中使用了一个pre.save(...)钩子,但是我想知道是否有更好的方法来实现它。

谢谢!

1 个答案:

答案 0 :(得分:1)

我看到的使用预挂钩的唯一问题是,如果预挂钩成功,然后实际保存失败,将会发生什么。在这种情况下,您可以考虑使用猫鼬交易来确保将数据保存为一个原子操作。

    const session = await SchemaB.startSession();
    session.startTransaction();
    try {
        // save new SchemaB
        // add to SchemA and save SchemaA

        await session.commitTransaction();
        session.endSession();

    } catch (e) {
        await session.abortTransaction();
        session.endSession();
    }