在 MongoDB 中,文档可以嵌套其他文档,这就是所谓的子文档。在 Mongoose 中,我们可以通过定义子文档来方便地处理这种文档嵌套的情况。本文将详细介绍 Mongoose 子文档的使用,包括定义子文档、存储、更新、查询等方面。
定义子文档
在 Mongoose 中,我们可以使用 mongoose.Schema
来定义子文档。假设我们有一个名为 Book
的模型,其中包含一个 Author
子文档,我们可以如下方式来定义 Author
:
-- -------------------- ---- ------- ----- -------- - -------------------- ----- ------------ - --- ----------------- ----- ------- ------ ------ --- ----- ---------- - --- ----------------- ------ ------- ------- ------------ --- ----- ---- - ---------------------- ------------
注意,子文档 Author
是一个单独的 Schema
,并不需要单独注册为模型,直接使用嵌套的方式定义即可。
存储子文档
在存储 Book
文档时,我们可以直接将 Author
作为一个对象传递给 Book
的构造函数,也可以先创建 Author
对象,再将其作为属性赋值给 Book
对象。下面是两种方式的示例代码:
-- -------------------- ---- ------- -- ---- ------ -- ----- ----- - --- ------ ------ --------- --------- ------- - ----- ----- ------ ---------------------- - --- ------------- -- --- ------ ------- ---- -- ----- ------ - --- -------- ----- ----- ------ ------------------ --- ----- ----- - --- ------ ------ --------- --------- ------- ------ --- -------------
在数据库中存储的文档如下所示:
-- -------------------- ---- ------- - ------ --------------------------- -------- --------- --------- --------- - ------- ----- -------- ----------------------- ------ -------------------------- -- ------ - - - ------ --------------------------- -------- --------- --------- --------- - ------- ----- -------- ------------------- ------ -------------------------- -- ------ - -
可以看到,Author
子文档被嵌套在 Book
文档中存储。
更新子文档
在更新 Book
文档中的 Author
子文档时,我们可以直接更新 Book
对象的 author
属性,也可以通过 findOneAndUpdate()
等方法来更新。下面是两种方式的示例代码:
-- -------------------- ---- ------- -- ---- ---- --- ------ -- ----------------------------------------- ----- ----- -- - -- ----- ----- ---- ---------------- - ----- ----------------- - --------------------- ------------ --- -- -- ------------------ ---- ---------------------- - ---- -------------------------- -- - ----- - -------------- ----- --------------- --------------------- - -- ----- ----- -- - -- ----- ----- ---- ------------------ - --
在数据库中更新后的文档如下所示:
-- -------------------- ---- ------- - ------ --------------------------- -------- --------- --------- --------- - ------- ----- -------- --------------------- ------ -------------------------- -- ------ - - - ------ --------------------------- -------- --------- --------- --------- - ------- ----- -------- ---------------------- ------ -------------------------- -- ------ - -
可以看到,Author
子文档被正确更新。
查询子文档
在查询 Book
文档中的 Author
子文档时,我们可以使用 populate()
方法来将 Author
子文档展开。下面是示例代码:
Book.find() .populate('author') .exec((err, books) => { if (err) throw err; console.log(books); });
在控制台输出的结果如下所示:
-- -------------------- ---- ------- - - ------ --------------------------- -------- --------- --------- --------- - ------ --------------------------- ------- ----- -------- --------------------- ------ - -- ------ - -- - ------ --------------------------- -------- --------- --------- --------- - ------ --------------------------- ------- ----- -------- ---------------------- ------ - -- ------ - - -
可以看到,Author
子文档被正确展开。
总结
本文介绍了 Mongoose 子文档的使用,包括定义子文档、存储、更新、查询等方面。子文档的使用使得数据库中的文档嵌套更加方便,减少了多集合查询的开销,提高了查询效率。在实际开发中,我们可以根据具体情况来灵活使用子文档,提高代码的可读性和可维护性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64d2fc86b5eee0b525a69950