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] 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章