Mongoose:引用另一个模型时使用 ref 类型或 [model schema] 有啥区别?

Posted

技术标签:

【中文标题】Mongoose:引用另一个模型时使用 ref 类型或 [model schema] 有啥区别?【英文标题】:Mongoose: What is the difference between using ref type or [model schema] when referring another model?Mongoose:引用另一个模型时使用 ref 类型或 [model schema] 有什么区别? 【发布时间】:2020-04-01 11:11:34 【问题描述】:

我想参考另一个模型(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】:

我猜你的意思是写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

因此,当我们需要博客及其作者时,我们只需像这样查询而不使用任何填充。

查询:

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

使用这种方法,当我们需要更新作者的信息时,会更加困难,因为它们必须在所有地方更新。

在引用方法中,我们只在博客的作者数组中保留作者 ID。所以博客文档是这样的:


    "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

但使用这种方法,更新作者数据会更容易、更快捷。

【讨论】:

【参考方案2】:

像这样使用 ref 类型作为模型架构:

var BlogSchema = new Blog(
...,
author: [type: mongoose.Schema.Types.ObjectId,
        ref: AuthorSchema ]

解决了 MongoDB 中尚不存在 ref 集合的问题。 如果在尚未创建集合的情况下使用 ref 作为字符串,如下所示: var BlogSchema = new Blog( ..., author: [type: mongoose.Schema.Types.ObjectId, ref: 'Author'] 你会得到一个错误: "MissingSchemaError: Schema 尚未为模型 'Author' 注册

【讨论】:

以上是关于Mongoose:引用另一个模型时使用 ref 类型或 [model schema] 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose 填充包含 ref 的对象数组

Mongoose 填充包含 ref 的对象数组

Mongoose - 填充删除的空引用?

Mongoose:深人口(填充人口密集的领域)

Mongoose:深人口(填充人口密集的领域)

Mongoose 存储另一个集合的 ObjectId 的引用