Mongoose 默认值使用时必须知道的几个要点

Mongoose 的文档中对 default 的介绍不多,导致在使用中可能会遇到一些bug,因此做一个总结。

设置 default

假设我们需要对某个字段赋予默认值,可以通过如下方式进行定义:

1
2
3
4
5
6
7
8
9
const schema = new Schema({
title: String,
date: {
type: Date,
// `Date.now()` returns the current unix timestamp as a number
// 此处必须是 function 才能实时更新时间
default: Date.now
}
});

default 定义有如下特点:

  • default 可以是值,也可以是 function

  • default 当是值类型时,会被 mongoose 缓存

    mongoose 在 model 初始化后,会缓存默认默认值,所以,如果默认时是一些实时的数据,比如时间,则要将 default 赋值为 function。

更新 default

当在 update()findOneAndUpdate() 中使用 upsert 选项时,Mongoose 会给没有值的默认字段设置默认值。

如果发现没更新默认值,可以传入参数setDefaultsOnInsert: true 来触发。

default 函数中的 this

default 函数中的 this 默认指向当前文档,因此可以在定义中通过自身参数来返回不同的默认值,比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
const schema = new Schema({
title: String,
released: Boolean,
releaseDate: {
type: Date,
default: function() {
if (this.released) {
return Date.now();
}
return null;
}
}
});

参考

  1. Defaults-Mongoose
  2. default date remains the same as the date of the process startup if indexed