在使用 Mongoose 进行开发时,我们经常需要设置默认值来正确地初始化数据模型。默认值可以在定义 Schema 时指定,也可以在保存文档时动态设置。本文将介绍 Mongoose 中的默认值处理方式,并提供一些优雅的解决方案。
Schema 中的默认值
在 Mongoose 中,可以通过在 Schema 中定义默认值来初始化文档。默认值可以是一个固定的值,也可以是一个函数,函数的返回值将作为默认值。
const userSchema = new mongoose.Schema({ name: { type: String, default: 'John Doe' }, age: { type: Number, default: 18 }, created_at: { type: Date, default: Date.now }, updated_at: { type: Date, default: () => new Date() }, });
在上面的例子中,我们为 name
和 age
设置了固定的默认值,为 created_at
设置了一个函数作为默认值,updated_at
的默认值也是一个函数,但是使用了箭头函数的形式。
动态设置默认值
有时候,我们需要在保存文档时动态设置默认值。比如,我们要为 created_at
和 updated_at
字段设置当前时间,而不是模式定义时的时间。
我们可以在保存文档前,手动设置这些字段的值。但是这种方式很繁琐,容易出错。更好的方式是使用 Mongoose 的 pre
中间件,这样就可以在保存文档前自动设置默认值。
userSchema.pre('save', function (next) { const now = new Date(); this.created_at = now; this.updated_at = now; next(); });
在上面的例子中,我们使用 pre
中间件,在保存文档前自动设置 created_at
和 updated_at
字段的值为当前时间。
优雅的默认值处理
在实际开发中,我们可能需要更复杂的默认值处理方式。下面是一些优雅的解决方案。
1. 使用默认值函数
默认值函数可以根据当前上下文动态生成默认值。比如,我们可以使用当前用户的 ID 作为默认值。
const userSchema = new mongoose.Schema({ name: { type: String, default: 'John Doe' }, created_by: { type: mongoose.Schema.Types.ObjectId, default: () => req.user.id }, });
在上面的例子中,我们使用一个函数作为 created_by
字段的默认值,这个函数可以访问当前请求的用户 ID。
2. 定义默认值常量
有时候,我们需要在多个模型中使用相同的默认值。为了避免重复定义,我们可以将这些默认值定义为常量,并在所有模型中使用。
-- -------------------- ---- ------- ----- ------------------ - - ----- ----- -------- -------- -- ----- ------------------ - - ----- ----- -------- -- -- --- ------ -- ----- ---------- - --- ----------------- ----- - ----- ------- -------- ----- ---- -- ----------- ------------------- ----------- ------------------- --- ----- ---------- - --- ----------------- ------ - ----- ------- --------- ---- -- -------- - ----- ------- --------- ---- -- ----------- ------------------- ----------- ------------------- ---
在上面的例子中,我们定义了两个默认值常量 DEFAULT_CREATED_AT
和 DEFAULT_UPDATED_AT
,并在 userSchema
和 postSchema
中使用。
3. 使用插件
如果我们需要在多个模型中使用相同的默认值处理逻辑,我们可以将这些逻辑封装为插件,以便在所有模型中使用。
-- -------------------- ---- ------- ----- ---------------- - -------- -------- -- - ------------ ----------- - ----- ----- -------- -------- -- ----------- - ----- ----- -------- -- -- --- ------ -- --- ------------------ -------- ------ - ----- --- - --- ------- --------------- - ---- -- ------------------ - --------------- - ---- - ------- --- -- ----- ---------- - --- ----------------- ----- - ----- ------- -------- ----- ---- -- --- ------------------------------------ ----- ---------- - --- ----------------- ------ - ----- ------- --------- ---- -- -------- - ----- ------- --------- ---- -- --- ------------------------------------
在上面的例子中,我们定义了一个插件 timestampsPlugin
,它为模型添加了 created_at
和 updated_at
字段,并且在保存文档前自动设置这些字段的值为当前时间。
总结
Mongoose 提供了多种方式来处理默认值。我们可以在 Schema 中定义固定的默认值,也可以使用函数动态生成默认值。使用 pre
中间件可以在保存文档前自动设置默认值。为了避免重复定义,我们可以将默认值定义为常量,并在所有模型中使用。使用插件可以将默认值处理逻辑封装起来,以便在多个模型中使用。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6505747695b1f8cacd1eddc6