Mongoose 是一款优秀的 Node.js ORM 框架,它可以帮助我们方便的定义 MongoDB Schema,并提供了灵活的查询和聚合操作接口。在实际应用开发中,我们经常需要根据业务需求动态生成 Schema,以适应不同的数据结构。Mongoose 提供了一些 API 可以帮助我们实现动态 Schema 的定义和使用,本文将介绍动态 Schema 的使用技巧和示例代码。
为什么需要动态 Schema
传统的 ORM 框架一般都需要定义静态的 Schema,即在代码中明确声明数据库表的结构,例如:
const User = new Schema({ name: { type: String }, email: { type: String }, age: { type: Number }, created: { type: Date, default: Date.now }, });
但在实际应用开发中,我们可能需要针对不同的业务场景动态生成 Schema,例如:
- 电商网站中商品分类可能会发生变化,需要动态改变产品的属性;
- 社交网站中用户信息可能会发生变化,需要动态改变用户的属性。
为了应对这类需求,Mongoose 提供了动态定义 Schema 的能力。
动态 Schema 的使用技巧
在 Mongoose 中定义动态 Schema,主要有以下两种方式:
方式一:使用 set() 方法
set() 方法允许在模式对象上动态设置属性,例如:
-- -------------------- ---- ------- ----- ------------- - --- -------- ----- - ----- ------ -- --------- - ----- ------ -- ------ - ----- ------ -- --- ----- ------- - ------------------------- --------------- ----- ------- - --- ---------- -- - ------ ------- --------------------------- - ----- ------ --- -- ----- ------------- - ------ ----- ---------------
上述示例中,我们通过 set() 方法向 ProductSchema 中动态添加了 color 属性,并给它赋值为 'red',最终将其保存进数据库中。
方式二:使用 dynamic 属性
dynamic 属性决定了 MongoDB 中是否允许保存没有在 Schema 中定义的字段。默认情况下 dynamic 为 true,也就是说可以随意保存任何字段,但如果把 dynamic 设为 false,那么 MongoDB 就会忽略没有在 Schema 中定义的字段。
-- -------------------- ---- ------- ----- ---------- - --- -------- ----- - ----- ------ -- ------ - ----- ------ -- ---- - ----- ------ -- -- - -------- ---- --- ----- ---- - ---------------------- ------------ ----- ---- - --- ------- -- - ------ ------- --------------- - -------- ----- ------------
上述示例中,我们通过设置 dynamic:true,使 UserSchema 具备了动态的属性,可以随意添加任何属性到 User 对象。例如上面示例的 extraField 属性,可以在 UserSchema 中不存在的情况下动态添加到 user 对象中,最终也能成功保存进数据库。
另外,如果需要动态删除某个属性,可以使用 unset() 方法:
product.schema.unset('color');
示例代码
在电商网站中,商品的属性可能会频繁发生变化,为了应对这个需求,我们可以使用动态 Schema 功能来实现:
-- -------------------- ---- ------- ----- ------------- - --- -------- ----- - ----- ------ -- --------- - ----- ------ -- ------ - ----- ------ -- --- ----- ------- - ------------------------- --------------- ----- ----------- - ----- ----------- ------------- ------ -- - ----- ------- - ----- ---------------------------- -- ---------- - ----- --- --------- ------- ----- ---- --- --------------- - -- ------ -------------------------------- - ----- ------ --- --------------------- - ------ ----- --------------- ------ -------- -- ----- -------------- - ----- ----------- ------------- -- - ----- ------- - ----- ---------------------------- -- ---------- - ----- --- --------- ------- ----- ---- --- --------------- - -- ------ ----------------------------------- ------ ---------------------- ----- --------------- ------ -------- -- -- ------- ----- --------------------------------------- -------- ------- -- ------ ----- ------------------------------------------ ---------
上述代码中,我们通过 addProperty 和 removeProperty 两个方法来演示动态添加和删除属性的操作流程。我们首先通过调用 findById() 方法获取到一个 Product 对象,然后通过 set() 或 unset() 方法来动态修改对象的 Schema,最后将对象保存到数据库中。
总结
动态 Schema 是 Mongoose 中非常有用的一项功能,它使得我们可以方便的根据业务需求动态生成 Schema,从而更好地适应不同的数据结构。在实际使用中,我们可以通过 set() 和 dynamic 属性来实现动态修改对象的 Schema,为我们的开发带来了更多的灵活性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6487d44a48841e989465f83d