我在mongoose模型中使用Date.now()
和Date.now
,但是我有点困惑它们之间的区别。请问你能帮助我吗?
我知道这是一个老问题,但是被接受的答案没有正确解释区别。它解释了行为上的区别,但没有解释它实际上的工作方式。
在mongoose
模式中,default
可以是指定类型的值或返回指定类型值的函数。Date.now
是一个内置的JavaScript函数,它以数字形式返回当前Unix时间戳。
如果你将Date.now
作为mongoose
模式中的default
传递,你正在传递该函数,mongoose
会在每次文档需要该属性的默认值时调用该函数。这会导致当前时间,即文档创建时的当前时间,被存储为该属性的值。
然而,如果你传递Date.now()
,你传递的是Date.now()
返回的值,而不是函数。通过这样做,你的文档将获得当前时间,即模式创建时的当前时间,作为该属性的默认值。这意味着你的文档将存储最新部署的时间,这可能不是你想要的。
如果Date.now
是一个常量"由Mongoose替换为创建新记录时的当前日期时间",如被接受的答案所建议的那样,则以下内容应逻辑上可行:
validUntil: {
type: Date,
default: Date.now + 3*60*60*1000 // 3 hours from now
}
但是Date.now
不能被mongoose
神奇地替换掉,它是一个函数,你不能将一个数字加到函数上。然而,你可以在自己的函数中调用一个函数并将结果加上一个数字,如下所示:
validUntil: {
type: Date,
default: () => Date.now() + 3*60*60*1000 // 3 hours from now
}
由于被接受的答案并没有明确说明Date.now
是一个函数而不是一个mongoose
常量,所以我想要澄清一下。 Date.now()
和Date.now
之间的区别在于Date.now()
调用该函数并返回结果,而Date.now
则返回函数本身。
Date.now
可以用于 Mongoose 模式定义中为字段设置默认值,而 Date.now()
则是其 JavaScript 等效方法。例如,在模式定义中设置默认值时,使用的是 Date.now
。有了这个模式定义,Mongoose 将使用当前时间填充 createdDate
字段。
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
//schema
var yourSchema= new Schema({
text: {type: String},
createdAt: {type: Date, default: Date.now}
});
然而,在编写针对您的架构的 JavaScript 代码时,您必须使用 Date.now()
yourSchema.pre('save', function doSomething(next){
var something = this;
something.createdAt(Date.now());
next();
});
Date.now
将被Mongoose替换为当前日期时间,因此对于每个记录它都会改变。然而,如果您使用 Date.now()
,则您的默认值将设置为一个固定值(模式的创建时间)。 - Alex
default
提供的值是一个函数,它将被调用。有了这个知识,您现在将能够理解更高级的默认模式选项用例。 - Patrick Fowler