Mongoose 是一个基于 Node.js 平台的 MongoDB 对象模型工具,它提供了一种非常简单而有许多方便工具的方式来处理 MongoDB 的数据,是 Node.js 平台上正在广泛使用的数据库驱动之一。在实际项目中,经常会涉及到多个集合之间的关联查询,本文将介绍 Mongoose 如何实现关联查询的方法及实例。
Mongoose 中集合关系的表示
在 Mongo 数据库中,集合之间的关系可以使用引用(Reference)和嵌入(Embedding)两种方式来表示。
引用(Reference)
引用就是使用一个文档的 ID 值引用另外一个文档。常见的是一对多或者多对多的关系,例如一个博客文章只能有一个作者,但是一个作者可以发布多篇博客文章。
在 Mongoose 中,引用关系可以使用 ref
属性来声明。例如,如果有两个集合:文章(Article
)和作者(Author
),那么在文章集合中引用作者可以这样声明:
const articleSchema = new mongoose.Schema({ title: String, author: { type: mongoose.Schema.Types.ObjectId, ref: 'Author', }, })
上面的代码中,author
引用了另一个集合 Author
中的文档。
嵌入(Embedding)
嵌入就是将一个文档嵌套到另一个文档中作为属性。常见的是一对一或者一对多的关系,例如一个用户可以有多个地址。
在 Mongoose 中,嵌入关系可以使用 Schema
类型的嵌套来声明。例如,如果有两个集合:用户(User
)和地址(Address
),那么在用户集合中嵌入地址可以这样声明:
-- -------------------- ---- ------- ----- ------------- - --- ----------------- ------- ------- ----- ------- ------ ------- ---- ------- -- ----- ---------- - --- ----------------- ----- ------- -------- -------------- --
上面的代码中,address
是一个嵌入了 Address
集合的文档。
关联查询
当数据库中有多个集合之间存在关联关系时,我们需要进行关联查询。例如,在上面的例子中,我们需要从文章集合中查询到作者信息。使用 Mongoose 很容易实现这个功能。
引用关系的关联查询
我们可以通过 populate
方法实现引用关系的关联查询。populate
方法可以将一个属性从引用的集合中填充到对应的文档中,查询结果会把作者的详细信息一并返回。以下是一个示例:
Article.findOne({ _id: articleId }).populate('author').exec(function(err, article) { // article.author 包含从 ‘Author’ 集合中查到的完整作者信息 })
上面的代码中,populate
方法的参数是要填充的属性名称,exec
方法用于执行查询操作。在查询结果中,author
属性会被填充为从 Author
集合中查到的完整的作者信息。
嵌入关系的关联查询
对于嵌入关系,嵌入的文档会被完整嵌入到对应的文档中,所以不存在关联查询的问题。只需要查询对应的文档即可。
示例
我们来看一下完整的代码示例:
-- -------------------- ---- ------- ----- -------- - ------------------- -- ----- -------------------------------------------- -- -- ------ -- ----- ------------ - --- ----------------- ----- ------- ------ ------- --------- -- ----- ------------------------------- ---- --------- --- -- ----- ------ - ------------------------ ------------- -- -- ------- -- ----- ------------- - --- ----------------- ------ ------- ------- - ----- ------------------------------- ---- -------- -- -- ----- ------- - ------------------------- -------------- -- ------ ----- ------ - --- -------- ----- ----- ----- ------ ------------------- -- -- ------ ----- ------- - --- --------- ------ ------ -------- ------- ----------- -- -- -------- --------------------------------- -- ------- ------------------------- - -- ----- ----- --- -------------------------- - -- ----- ----- --- -- --------- ----------------- ---- ----------- ---------------------------------------- -------- - -------------------------------- -- ---- --- -- -- --
上面的代码中,我们创建了一个作者和一篇文章,并将文章填充到作者的 articles
属性中。之后,我们通过 populate
方法查询文章并关联作者,并输出作者的名称。
总结
本文介绍了 Mongoose 中引用和嵌入关系的表示方式,以及如何使用 populate
方法实现关联查询。需要注意的是,当集合之间关联过多时,会导致查询性能变慢,需要进行优化。但无论是什么情况,使用 Mongoose 可以轻轻松松地实现关联查询。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64e6d386f6b2d6eab322e8bc