Mongoose 是 Node.js 中用户最多的 MongoDB ORM 库之一,它提供了很方便的方法把 MongoDB 和 Node.js 结合起来的。在实际的项目开发中,我们常常需要在 MongoDB 中创建多个表之间的关联关系。Mongoose 提供了多个关联数据的方式,其中子文档是一种非常常用的方式。本文将会详细介绍在 Mongoose 中如何使用子文档来关联数据。
什么是子文档?
在 MongoDB 的集合中,文档中的某个字段也可以是一个文档,被称为子文档,子文档也可以被使用索引、查询和更新等操作。Mongoose 允许我们把一个文档嵌套在另一个文档中,创造一种类似于关系型数据库中数据库的关系表的结构。通过嵌套文档可以把多个表的数据关联在一起,做到更方便地获取数据、更快的查询速度、更少的查询次数等好处。
子文档的创建与使用
创建子文档
我们可以通过定义嵌套的 schema 来创建子文档。以下是一个创建通过 book 字段和 author 字段创建一个书籍的例子:
const bookSchema = new mongoose.Schema({ name: String, author: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Author' }], });
在以上的例子中,通过 bookSchema 定义了 name 和 author 两个字段的类型, author 中将储存 Author 表中对应的记录的 ObjectId。该 ObjectId 对象是使用 ref 参数自动关联到 Author 表的主键字段的。这里 Author 表是另外一个包含作者详细信息的 MongoDB 集合。
在定义完成之后,我们可以将该子文档附加到主表上:
const Book = mongoose.model('Book', bookSchema);
使用子文档
我们可以使用 populate()
方法来将子文档的关联信息查询出来。以下是一个查询本书及其对应作者信息的例子:
Book. findOne({ name: 'A Tale of Two Cities' }). populate('authors'). exec(function (err, book) { if (err) return handleError(err); console.log('The authors of the book are:', book.authors); });
通过 populate()
方法,我们可以比较方便地获取子文档的信息。
示例代码
下面是一个完整的示例代码。在实现该例之前,我们需要先启动本地 MongoDB 服务,并创建一个名为 subdocuments
的数据库。在本地的 MongoDB 中,我们为该示例创建了一个 books
和一个 authors
集合。
-- -------------------- ---- ------- ----- -------- - -------------------- ---------------------------------------------------- - ---------------- ---- --- ----- ------------ - --- ----------------- ----- ------- ---- ------- --- ----- ------ - ------------------------ -------------- ----- ---------- - --- ----------------- ----- ------- ------- - ----- ------------------------------- ---- -------- -- --- ----- ---- - ---------------------- ------------ ----- ------- - --- -------- ----- ----- ------- ---- --- --- --------------------- ----- - -- ----- ------ ------------------- ----- ----- - --- ------ ----- -- ---- -- --- -------- ------- ------------ --- ------------------- ----- - -- ----- ------ ------------------- -------------- ----- -- ---- -- --- ------- ----------------------------------- ----- ----- - -- ----- ------ ------------------- ---------------- ------ -- --- ---- ----- ------------- ---------------------------- --- --- ---
运行该示例之后,我们可以在控制台中看到以下信息。
The author of the book is: { _id: 5d38e079c2eea466f40d17e1, name: 'John Smith', age: 32, __v: 0 }
总结
子文档是 MongoDB 中非常实用的一种文档关系,它可以通过嵌套文档把多个集合中的数据联系在一起。使用子文档来关联数据,除了使用方便之外,还可以减少查询次数,提高查询速度。在 Mongoose 中,我们可以通过定义嵌套的 schema 来创建子文档,在查询时使用 populate()
方法来获取子文档的信息。本文中的示例代码可以作为你学习和实践使用子文档功能的入门例程,希望对大家有所帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/647afdcb968c7c53b069242f