在 Mongoose 中使用 Virtuals
Mongoose 是 Node.js 中应用广泛的 Object Document Mapping(ODM)库,它为我们提供了映射 MongoDB 数据库的能力。除了基本的 CRUD 操作外,Mongoose 还提供了一些高级功能,例如 Virtuals,它允许我们在 Schema 中定义虚拟字段,这些字段不会存在于数据库中,但可以通过 Mongoose 查询和操作,它们的值是通过指定的函数计算得到的。
Virtuals 的用途非常广泛,比如处理一些计算得到的数据,展示数据之前的转换,拼接多个字段等。在本文中,我们将一步步学习在 Mongoose 中如何使用 Virtuals。
Virtuals 的定义
在 Mongoose 中,Virtuals 的定义需要在 Schema 上定义,可以使用 Schema.Types.Virtual 方法。以下是一个简单的示例,它定义了一个名为 fullName 的 Virtual:
-- -------------------- ---- ------- ----- -------- - ------------------- ----- ---------- - --- ----------------- ---------- ------- --------- ------ -- --------------------------------------------- - ------ -------------- - - - - ------------- --
在上面的代码中,我们定义了一个 User Schema,并在其上定义了一个名为 fullName 的 Virtual,这个 Virtual 的值是通过 firstName 和 lastName 属性的字符串拼接得到的。
Virtuals 的使用
有两种方式可以使用 Virtuals:通过查询数据和在 Model 实例上直接访问。
查询数据
在查询数据时,Virtuals 默认是不会被包含在查询结果中的,需要通过 set() 或者 get() 方法来显式地指定。
const User = mongoose.model('User', userSchema) User.findOne({}, function(err, user) { console.log(user.fullName) // 'John Doe' }).select('fullName')
上面的代码中,我们使用 select() 方法指定查询结果只包括 fullName 属性。
在 Model 实例上直接访问
在 Model 实例上访问 Virtuals 的方式非常简单,就像访问普通的 Model 属性一样。
const user = new User({ firstName: 'John', lastName: 'Doe' }) console.log(user.fullName) // 'John Doe'
Virtuals 计算的属性值设置
在上面的 Virtuals 示例中,我们使用了 get() 方法来定义 Virtual 值的计算方式。Mongoose 还支持使用 set() 方法来定义 Virtual 的值的计算方式。set() 方法定义了 Virtual 的值如何存储到 Model 属性中。
-- -------------------- ---- ------- ----- -------- - ------------------- ----- ---------- - --- ----------------- ---------- ------- --------- ------ -- --------------------------------------------- - ------ -------------- - - - - ------------- ------------------------- - ----- ----- - ---------------- -- -------------- - -------- ------------- - -------- -- ----- ---- - ---------------------- ----------- ----- ---- - --- ------ ---------- ------- --------- ----- -- ------------- - ----- ---- --------------------------- -- ------ -------------------------- -- -----
在上面的代码中,我们定义了一个 set 方法,它以 fullName 为参数,将 fullName 按照空格分隔成 firstName 和 lastName,并将它们分别设置到 Model 上。我们可以像操作正常的 Model 属性一样使用 user.fullName = 'Jane Doe' 来设置 Virtual 值。
小结
Mongoose 的 Virtuals 功能是一个非常强大的功能,它允许我们定义虚拟属性来处理不存储在数据库中的数据。通过本文,您已经学会了如何在 Mongoose 中定义和使用 Virtuals。在实际的开发中,我们经常会使用 Virtuals 来处理一些特殊的场景,例如规范化数据,计算计算过程中的值,简化数据处理等。希望这篇文章能对你有所帮助!
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67971cf7504e4ea9bde22fd4