假设我的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
...
});
}
});
答案 0 :(得分:0)
我的建议是实际创建一个关联集合UserBook
,您将从User
和Book
集合中引用该集合。
UserBook
将包含两个字段,一个字段用于 book 的ID,另一个字段用于 user 的ID。
关于更新:首先,将更新关联集合,然后从关联集合传播到两个集合。举例来说,假设您要更新一本书,实际上要做的就是更新UserBook
集合,该集合将在为什么要启动更新的过程中进行设计,例如:
答案 1 :(得分:0)
中间件/挂钩的documentation指出:
save()
,update()
等上的findOneAndUpdate()
钩子前后均未执行。
因此,对book.save();
的调用不应触发user
的保存中间件。