Пн goose: В чем разница между использованием типа ref или [схемы модели] при обращении к другой модели? - PullRequest
1 голос
/ 01 апреля 2020

Я хочу сослаться на другую модель (отношения 1: N), и у меня этот код работает правильно:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

AuthorSchema = require('./Author.js');

var BlogSchema = new Blog({
  ...,
  author: [AuthorSchema]
});

В чем разница между этим подходом и использованием ссылки (например, ниже :)

var BlogSchema = new Blog({
    ...,
    author: [{type: mongoose.Schema.Types.ObjectId,
            ref: 'Author'}]
}

Спасибо за помощь.

1 Ответ

0 голосов
/ 01 апреля 2020

Полагаю, вы хотели написать new Schema вместо new Blog.

При первом подходе мы встраиваем информацию об авторе в блог следующим образом:

{
    "_id": "5e84967e28bc413f14b43fce",
    "title": "blog 1 title",
    "author": [
        {
            "_id": "5e84967e28bc413f14b43fd0",
            "name": "author 1 name"
        },
        {
            "_id": "5e84967e28bc413f14b43fcf",
            "name": "author 2 name"
        }
    ],
    "__v": 0
}

когда нам нужен блог и его авторов, мы просто запрашиваем, как это, без использования каких-либо заполнений.

query:

router.get("/blogs/:id", async (req, res) => {
  const result = await Blog.findById(req.params.id);
  res.send(result);
});

При таком подходе, когда нам нужно обновить информацию об авторе, он будет сложнее, так как они должны обновляться во всех местах.

В ссылочном подходе мы сохраняем только идентификаторы автора в массиве автора блога. Таким образом, документ блога выглядит следующим образом:

{
    "title": "blog 1 title",
    "author": [
        "5e849753cf11581f683012b4",
        "5e84975bcf11581f683012b5"
    ]
}

Примеры документов, на которые ссылаются авторы в коллекции авторов:

{
    "_id": "5e849753cf11581f683012b4",
    "name": "author 1 name",
    "__v": 0
}

{
    "_id": "5e84975bcf11581f683012b5",
    "name": "author 2 name",
    "__v": 0
}

Теперь, если мы хотим получить блог, а его авторы - полные данные, нам нужно использовать заполнение следующим образом:

router.get("/blogs/:id", async (req, res) => {
  const result = await Blog.findById(req.params.id).populate("author");
  res.send(result);
});

Дать этот результат:

{
    "author": [
        {
            "_id": "5e849753cf11581f683012b4",
            "name": "author 1 name",
            "__v": 0
        },
        {
            "_id": "5e84975bcf11581f683012b5",
            "name": "author 2 name",
            "__v": 0
        }
    ],
    "_id": "5e849792cf11581f683012b6",
    "title": "blog 1 title",
    "__v": 0
}

Но при таком подходе обновление данных об авторах будет проще и быстрее.

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