前言
Mongoose 是 Node.js 上非常受欢迎的 MongoDB ODM,能够帮助我们更方便的在 JavaScript 中操作 MongoDB。虚拟属性是 Mongoose 中非常强大的功能之一,它可以让我们在查询数据库时自动计算一些值,从而避免了多余的计算和存储。
普通属性和虚拟属性的区别
在 Mongoose 中,一个模型实例通常由两种属性组成:从数据库中获取的普通属性和在模型定义中定义的虚拟属性。普通属性是数据库表中的真实字段,而虚拟属性则不会存在于数据库表中。
在数据库中存储某个值需要相应的空间,而有时我们不需要在数据库表中存储一个字段的值,而是根据其他字段计算出来显示该属性。这时,虚拟属性就可以派上用场了。
应用场景
虚拟属性主要的应用场景是构造复杂的属性值和优化数据库访问。以下是一些常见的应用场景:
计算属性
我们可以使用虚拟属性,将模型属性计算后放到一个新的属性中。示例代码如下:
-- -------------------- ---- ------- ----- ---------- - --- ----------------- ------ ------- -------- ------ --- --------------------------------------------- - ------ ------------------------- ----- --- ----- ---- - ---------------------- ------------ ----- ---- - ----- -------------- ------ ------ --- --------------------------- -- ------------------
在上面的示例代码中,我们在 PostSchema
上定义了一个名为 abstract
的虚拟属性,并在属性的 get
函数中计算文章的摘要。
关联属性
我们可以使用虚拟属性将两个模型实例之间的关联链接起来。例如,在微博中,每个用户都可以发布多篇微博,我们可以使用虚拟属性获取用户发表的所有微博。示例代码如下:
-- -------------------- ---- ------- ----- ---------- - --- ----------------- --------- ------ --- --------------------------- - ---- ------- ----------- ------ ------------- -------- --- ----- ---------- - --- ----------------- ------ ------- -------- ------- ------- - ----- ------------------------------- ---- ------ - --- ----- ---- - ---------------------- ------------ ----- ---- - ---------------------- ------------ ----- ---- - ----- -------------- --------- ---- ---------------------------- ------------------------ -- -----------
在上面的示例代码中,我们在 UserSchema
上定义了一个名为 posts
的虚拟属性,它的 ref
属性指向 Post
模型,它的 localField
属性指向 _id
字段,它的 foreignField
属性指向 author
字段。在定义完虚拟属性后,我们可以使用 populate
进行关联查询。
格式化日期
我们可以使用虚拟属性将日期格式化为特定的显示格式。示例代码如下:
-- -------------------- ---- ------- ----- ---------- - --- ----------------- --------- ------- ---------- ---- --- ------------------------------------------------------- - ------ ----------------------------------------- ----------- --- ----- ---- - ---------------------- ------------ ----- ---- - ----- -------------- --------- ---- --- -------------------------------------
在上面的示例代码中,我们在 UserSchema
上定义了一个名为 createdAtFormatted
的虚拟属性,并在属性的 get
函数中使用 moment.js 格式化日期。
使用方法
在 Mongoose 中,我们可以通过以下方式定义虚拟属性:
-- -------------------- ---- ------- ----- ------ - --- ----------------- --- --- ------------------------------------- - ------ ---------- - - - - ---------- --- ----- ----- - ----------------------- --------
在上面的代码中,我们在 schema
实例上使用 virtual
方法定义了一个名为 name
的虚拟属性,并在属性的 get
函数中将 first
和 last
属性拼接后返回。
总结
虚拟属性是 Mongoose 中非常有用的功能,它可以大大简化我们的代码实现,并优化数据库访问。在使用虚拟属性时,我们需要根据实际业务场景灵活运用,在查询数据库时自动计算一些值,从而避免了多余的计算和存储。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/648edd9c48841e9894d45353