在 Mongoose 中,除了存储文档本身的属性以外,还可以定义虚拟属性(Virtuals),这些属性并不实际存储在数据库中,但是可以在文档中访问。虚拟属性的定义可以基于文档本身的数据,以及其他关联的集合文档数据。
虚拟属性的定义
在 Mongoose 中定义一个虚拟属性,需要在 Schema 中使用 get
和 set
方法,例如:
-- -------------------- ---- ------- ----- ------------ - --- ----------------- ---------- ------- --------- ------ -- - ------- - --------- ---- -- --------- - --------- ---- - --- ----------------------------------------------- - ------ ------------------ ------------------ --- ------------------------------------------------------- - ----- ----------- --------- - ---------------- --- -------------- - ---------- ------------- - --------- ---
在上面的例子中,定义了一个虚拟属性 fullName
,它由 firstName
和 lastName
组合而成。get
方法返回值,set
方法将参数解构为 firstName
和 lastName
并分别存储到属性中。
虚拟属性的使用
虚拟属性的使用像普通属性一样,可以通过 toJSON
和 toObject
操作,也可以直接访问文档属性。例如:
const person = new Person({ firstName: 'John', lastName: 'Doe' }); console.log(person.fullName); // 'John Doe' console.log(person.toObject().fullName); // 'John Doe' console.log(person.toJSON().fullName); // 'John Doe'
虚拟属性的应用场景
虚拟属性的定义灵活,可以根据具体场景设计实现。以下是一些常见应用场景:
关联文档数据
虚拟属性可以通过关联的集合文档数据计算得出。例如:
-- -------------------- ---- ------- ----- ---------- - --- ----------------- ------ ------- --------- ------ --- ----- ---------- - --- ----------------- ------ ------- -------- ------- ------- - ----- ------------------------------- ---- ------ - --- --------------------------------- - ---- ------- ----------- --------- ------------- ------ -------- ----- ---------- - ----------- - - ----- -- -- ----- - ------ ------------------ - ---
在上面的例子中,定义了一个虚拟属性 authorEmail
,它基于集合 User
中的 email
字段与集合 Post
中的 author
字段关联计算得出。set
方法将 email
解构为 author
对象,并存储到属性中,get
方法返回 author.email
。
计算统计数据
虚拟属性可以通过某些文档数据的统计计算得出。例如:
-- -------------------- ---- ------- ----- ------------- - --- ----------------- ----- ------- ------ ------- -------- -- ----- ------- ---- -- ---- - -- --- -------------------------------------------- -- - -- --------------------- - ----- --- - --------------------------- ------- -- ----- - ------- --- ------ --- - -------------------- - ------ ----- ---
在上面的例子中,定义了一个虚拟属性 rating
,它基于文档中 ratings
数组中的数据统计计算得出。如果 ratings
数组为空,则返回 null
。
总结
Mongoose 中的虚拟属性提供了一种灵活、可定制的方式处理特定场景的属性计算。对于一些不需要真正存储到数据库中的属性,或者需要根据特定关联计算得出的属性,虚拟属性是很好的解决方案。在使用虚拟属性的时候需要考虑其应用场景,确保在应用中得到恰当的使用和维护。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64ee8344f6b2d6eab387fbba