在使用 Mongoose 进行 MongoDB 开发时,我们通常会使用 Mongoose 提供的默认数据类型,如 String、Number、Date 等。然而,在实际开发中,我们常常遇到需要自定义数据类型的情况,如自定义金额类型、经纬度类型等。这时,Mongoose 提供了自定义类型的功能,可以方便地进行扩展。
自定义类型的基本用法
在 Mongoose 中,自定义类型需要使用 SchemaType
。下面是一个创建自定义类型的示例:
-- -------------------- ---- ------- ----- -------- - -------------------- ----- ------ - ---------------- ----- ----------- - --- -------- ---- ------- ---- ------ --- ----- ----- - -------------------------------- ---------
上面的示例中,我们创建了一个名为 Point
的自定义类型,它包含两个属性 lat
和 lng
,分别表示经纬度。
然后,我们可以将这个类型应用到模型的属性中,如下所示:
-- -------------------- ---- ------- ----- -------------- - --- -------- ----- ------- ------------ - ----- ------ --------- ---- - --- ----- -------- - -------------------------- ----------------
在这个示例中,我们定义了一个名为 Location
的模型,其中包含一个属性 coordinates
,类型为上面定义的自定义类型 Point
。
实例介绍
下面我们来看一个实际的应用场景,以实现自定义金额类型为例。
创建自定义类型
首先,我们需要定义一个自定义类型,表示金额。它应该包含两个属性:amount
表示金额数值,currency
表示货币名称。这里我们可以使用 Mongoose 中的 Map
类型来表示货币名称。代码如下所示:
-- -------------------- ---- ------- ----- ----------- - --- -------- ------- ------- --------- - ----- ---- --- ------- ----- ------- ------ ------ - --- ----- ----- - -------------------------------- ---------
在这个定义中,我们使用了 Map
类型来表示 currency
属性。Map
类型允许我们指定一个键值对,这里的键为它对应的字符串,“of” 表示键对应的值的类型。enum
表示可选值的范围,这里我们只允许使用 'USD', 'EUR', 'CNY' 三种货币。
使用自定义类型
有了自定义类型后,我们需要将它应用到模型的属性中。假设我们要定义一个 Order
模型,其中包含一个属性 total
表示总金额,我们可以这样定义:
-- -------------------- ---- ------- ----- ----------- - --- -------- ------ -- ----- ------- --------- ---- --- ------ - ----- ------ --------- ---- - --- ----- ----- - ----------------------- -------------
在这个定义中,我们使用了上面定义的自定义类型 Money
。
自定义类型的值解析
当我们从数据库中读取数据时,Mongoose 会自动将值解析为已定义的类型。下面是一个解析自定义金额类型的示例:
const order = await Order.findOne({ _id: id }); console.log(order.total); // { amount: 100, currency: { USD: 'USD' } }
在这个示例中,order.total
的值是解析后的对象,包含 amount
和 currency
两个属性。currency
的值是一个键名为 'USD' 的对象。
自定义类型的值验证
在进行值验证时,Mongoose 会调用自定义类型的 validate
方法,我们可以在这个方法中进行值的验证和处理。下面是一个自定义金额类型的 validate
方法:
-- -------------------- ---- ------- ------------------------ - -------- ------- ----- - -- -------- - ------- - ----- ---- - ---------------------------- -- ------------ --- -- - ----- --- ------------------------ ----------------- -- --- -------- - ----- -------- - -------- -- ------------------------- --- --------- - ----- --- ------------------------ ----------------- -- --- -------- - ------ ----- -
在这个 validate
方法中,我们首先判断 value
是否为空。然后,我们使用 Object.keys
方法获取 currency
对象的所有键,并判断其长度是否为 1。最后,我们判断 currency
的键值是否与键名相同。
总结
本文介绍了 Mongoose 中自定义类型的使用方法和实例。在实际开发中,我们经常需要自定义数据类型,以适应具体业务需求。自定义类型可以方便地扩展 Mongoose 的默认数据类型,并提高开发效率。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6489855948841e98947ceb63