Mongoose 是 Node.js 使用最广泛的 MongoDB 驱动程序,它提供了 Virtual 功能,用于定义不保留在数据库中的属性。在本文中,我们将介绍 Mongoose 中 Virtual 的详细使用方法和注意事项,并提供示例代码,帮助您更好地理解。
什么是 Virtual?
Virtual 是一个与 Model 实例相关联的属性,该属性不会被存储在 MongoDB 文档中。我们可以使用 Virtual 属性将两个或多个属性合并成一个属性或根据已存储的属性计算新属性。
Virtual 可以定义为两种类型:
- Getter:当虚拟属性被访问时,将返回计算值。
- Setter:当虚拟属性被设置时,它将计算出该属性的计算值,并返回给用户。
Mongoose 支持使用 get
和 set
选项来创建这两种类型的 Virtual 属性。
创建 Virtual 属性
要创建一个 Virtual 属性,我们首先需要创建一个 Schema,然后再在该 Schema 中添加 Virtual 属性。以下是创建一个包含 Virtual 属性的示例 Schema:
----- -------- - -------------------- ----- ------------ - --- ----------------- ---------- ------- --------- ------ --- --------------------------------------------- -- - ------ ------------------ ------------------ --- -------------- - ------------------------ --------------
在上面的示例中,我们定义了一个名为 AuthorSchema
的 Schema,并在其上调用了 virtual()
方法,告诉 Mongoose 我们将要创建一个虚拟属性。接下来,我们使用 get
方法定义了 fullName
属性的 getter 函数,该函数将返回 firstName
和 lastName
的值组成的字符串。
我们可以使用下面的代码来验证这个 Virtual 属性的工作原理:
----- ------ - -------------------- ----- ------ - --- -------- ---------- ------- --------- ----- --- ----------------------------- -- ---- ---
在上面的代码中,我们使用 new
关键字创建一个 Author
实例,然后通过 fullName
属性获取作者的全名。
警告:不要直接设置 Virtual 属性
Virtual 属性是只读的,这意味着您不能用赋值语句直接设置这些属性。例如,您不能使用 author.fullName = 'Jane Doe';
这样的代码将作者的全名更改为“Jane Doe”,因为 Virtual 属性没有与原始文档关联的存储值。
要更改属性的值,请更改原始属性,然后再使用 Virtual 属性计算新值,或者使用 setter 函数。
下面是一个更改 Virtual 属性值的错误示例:
----- ------ - --- -------- ---------- ------- --------- ----- --- --------------- - ----- ----- -- ---- ---- --- ----
创建 Virtual 属性时的性能注意事项
从值的角度来看,Virtual 属性的计算是相当昂贵的。如果您定义了大量 Virtual 属性,那么您的模型可能会变得非常缓慢。在进行大型查询时,可以避免使用 Virtual 属性。
Virtual 属性与实时计算的区别
当您创建 Virtual 属性时,Mongoose 实际上并未在数据库中存储该属性。这意味着获取 Virtual 属性的值需要计算,而实时计算属性则存储在数据库中,并随着每次保存变为最新的值。
具体来说,如果您希望在存储的数据上执行有效的计算,则应使用实时计算属性。但是,如果您的目标是使用多个属性创建新的 Virtual 属性,或者您只需要获取计算得到的值,然后丢弃每个属性的值,则 Virtual 是更好的选择。
结论
在本文中,我们介绍了 Mongoose 中 Virtual 的概念,及其创建 Virtual 属性的方法和注意事项。使用 Virtual 属性可以帮助我们将逻辑组织得更好,并避免对数据库的频繁访问。但是在大型查询或查询更新方面,使用 Virtual 属性可能并不是最好的选择。希望本文可以为您提供帮助,带您更深入地了解 Virtual 在 Mongoose 中的使用。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/671ca3349babaf620fb1b01f