ExpressJS / Mongoose双向模型通信

时间:2018-06-26 19:12:58

标签: javascript node.js express mongoose

假设我的Express应用程序中有一个User模型和一个Book模型,它们两者相互引用-保存猫模型时,如何使用猫鼬中间件使两个模型同步?

如果可以使用以下结构,那会很好,因此,当Book的名称被修改时,它的作者User也会被更新,反之亦然。 / p>

然后的问题当然是User模型引用Book模型,而Book模型引用User模型-循环引用。有什么方法可以以一种简洁而传统的方式规避这一点?

user.model.js

const { mongoose } = require('../db/mongoose');
const Schema = mongoose.Schema;

const Book = require('./book.model.js'); // <--- REFERENCING BOOK

const UserSchema = new Schema({
    name: String,
    books: [
        {
            _id: Schema.Types.ObjectId,
            title: String,
        },
    ],
});

UserSchema.pre('save', function() {
    if (this.isModified('name')) {
        Book.findAndUpdate({
            'author._id': this._id,
        }, {
            // update name of book author
            'author.name': this.name,
        });
    }
});

book.model.js

const { mongoose } = require('../db/mongoose');
const Schema = mongoose.Schema;

const User = require('./user.model.js'); // <--- REFERENCING USER

BookSchema = new Schema({
    title: String,
    author: {
        _id: Schema.Types.ObjectId,
        name: String,
    },
});

BookSchema.pre('save', function() {
    if (this.isModified('title')) {
        User.findByIdAndUpdate(this.author._id, {
            // update the book title
            ...
        });
    }
});

2 个答案:

答案 0 :(得分:0)

我的建议是实际创建一个关联集合UserBook,您将从UserBook集合中引用该集合。

UserBook将包含两个字段,一个字段用于 book 的ID,另一个字段用于 user 的ID。

关于更新:首先,将更新关联集合,然后从关联集合传播到两个集合。举例来说,假设您要更新一本书,实际上要做的就是更新UserBook集合,该集合将在为什么要启动更新的过程中进行设计,例如:

enter image description here

答案 1 :(得分:0)

中间件/挂钩的documentation指出:

  

save()update()等上的findOneAndUpdate()钩子前后均未执行。

因此,对book.save();的调用不应触发user的保存中间件。