ExpressJS / Mongoose двусторонняя модель связи - PullRequest
0 голосов
/ 26 июня 2018

Скажем, у меня есть модель User и модель Book в моем приложении Express, которые оба ссылаются друг на друга - как я могу использовать промежуточное ПО mongoose для синхронизации обеих моделей при сохранении любой из моделей?

Думаю, было бы неплохо, если бы я мог использовать следующую структуру, чтобы при изменении имени Book он также обновлялся в своем авторе User и наоборот.

Проблема, конечно, в том, что модель 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 голосов
/ 27 июня 2018

Документация для промежуточного программного обеспечения / перехватчиков утверждает, что:

До и после save() хуки не выполняются на update(), findOneAndUpdate() и т. Д.

Следовательно, вызов book.save(); не должен запускать промежуточное программное обеспечение сохранения его user.

0 голосов
/ 26 июня 2018

Я бы предложил создать коллекцию ассоциаций UserBook, на которую вы будете ссылаться из коллекций User и Book.

UserBook будет содержать два поля, одно для идентификатора book и другое для идентификатора пользователя .

Что касается обновлений: вы начнете с обновления коллекции связей, а затем распространите ее на обе коллекции. Скажем, вы хотите, например, обновить книгу, то, что вы на самом деле будете делать, это обновить коллекцию UserBook, которую вы разработаете, для чего запускать обновления, что-то вроде этого:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...