Mongoose 是 Node.js 中使用最广泛的 MongoDB 驱动程序之一。 Mongoose 的流行程度主要归功于其易用性和灵活性,但是它也具有其他许多强大的功能,其中 Populate 和 Ref 是其中的两个重要特性。这篇文章将对 Mongoose 中的 Populate 和 Ref 进行详细解释,并提供代码示例以帮助初学者更好地理解这些特性。
什么是 Populate 和 Ref?
Mongoose 的 Populate 特性可用于将其中一个模型中的文档引用替换为另一个模型中的文档。 Ref 是 Populate 特性的一部分,它可以在模型定义中帮助定义文档之间的关系,通常是一个文档引用另一个文档。
举个例子:
假设我们正在开发一个博客应用程序,其中一篇帖子可以与其他用户相关联。 在这种情况下,我们有两个模型: User
和 BlogPost
。
-- -------------------- ---- ------- ----- ---------- - ----------------- ----- ------- ------ ------- ------ -- ----- ------------------------------- ---- ---------- -- --- ----- -------------- - ----------------- ------ ------- -------- ------- ------- - ----- ------------------------------- ---- ------ - ---展开代码
在这里,我们使用 ref
属性来定义文档之间的关系。 在 User
模型中,我们将 posts
字段定义为一个数组,其中每个元素是一个指向 BlogPost
模型的文档的对象 ID。 在 BlogPost
模型中,我们通过引用 User
模型来定义 author
字段。
这样,我们可以使用 Mongoose 中的 Populate 特性来显示有关每篇帖子和其作者的完整信息。
Populate 的使用方法
如果我们想在查询中填充模型之间的关系,我们可以像这样使用 populate()
:
BlogPost.findOne({ title: 'My Awesome Blog Post' }) .populate('author') .then(post => { console.log(post.author.name); });
在这里,我们首先查找标题为“My Awesome Blog Post”的博客文章。通过调用 populate('author')
来实现填充,我们可以在回调函数中访问完整的作者文档信息。
如果我们在 User
模型中定义了 posts
字段,我们还可以使用 populate 填充此字段:
User.findOne({ name: 'Ada Lovelace' }) .populate('posts') .then(user => { console.log(user.posts[0].title); });
这将获取具有名称“Ada Lovelace”的用户,并通过 populate('posts')
填充该用户的 posts
字段。 在这种情况下,我们可以在回调函数中访问该用户发布的第一篇博客文章的标题。
Ref 的使用方法
如上所述,ref 属性可以用于在模型定义中定义文档之间的关系。通常,我们使用以下代码将一个模型嵌入到另一个模型中:
const UserSchema = mongoose.Schema({ posts: [BlogPostSchema] }); const BlogPostSchema = mongoose.Schema({ author: UserSchema });
在这里,我们将 BlogPostSchema 包含在 UserSchema 中。 但是,这是将两个模型逻辑上关联的方法是没有意义的,因为它无法让 Mongoose 知道两个模型之间的真实关系。
考虑下面的模型:
-- -------------------- ---- ------- ----- ---------- - ----------------- ----- ------- ------ ------- ------ -- ----- ------------------------------- ---- ---------- -- --- ----- -------------- - ----------------- ------ ------- -------- ------- ------- - ----- ------------------------------- ---- ------ - ---展开代码
在这里,我们使用 ref
属性来明确表示 User
模型与 BlogPost
模型之间的关系。 在 User
模型中,我们定义了一个 posts
字段,其中包含指向 BlogPost
模型的文档的对象 ID。 在 BlogPost
模型中,我们使用 { type: mongoose.Schema.Types.ObjectId, ref: 'User' }
来定义一个 author
字段,该字段包含一个指向 User
模型的文档的对象 ID。
这样,Mongoose 就知道 User
和 BlogPost
模型之间的关系了,并且在使用 populate
时可以正确填充这些关系。
总结
在本文中,我们介绍了 Mongoose 中的 Populate 和 Ref 特性。 Populate 可以用于将其中一个模型中的文档引用替换为另一个模型中的文档。而 Ref 属性可用于在模型中定义文档之间的关系。
当我们了解了这些特性后,我们就能够使用 Mongoose 更好地组织我们的数据模型,并使用 populate 从文档中检索出有用的信息。 Mongoose 是一个强大的工具,因此建议深入学习这些特性以及其他 Mongoose 提供的功能。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64787644968c7c53b04b3e3e