【发布时间】:2025-12-15 21:55:01
【问题描述】:
我在猫鼬模型中使用Date.now() 和Date.now。
我对它们之间的区别有点困惑。你能帮帮我吗?
【问题讨论】:
我在猫鼬模型中使用Date.now() 和Date.now。
我对它们之间的区别有点困惑。你能帮帮我吗?
【问题讨论】:
我知道这是一个老问题,但接受的答案并没有正确解释差异。它解释了行为上的差异,但没有解释它实际上是如何工作的。
在您的mongoose 架构中,您的default 可以是指定类型的值,也可以是返回指定类型值的函数。 Date.now 是一个内置的 Javascript 函数,它以数字形式返回当前的 unix 时间戳。
如果您在mongoose 架构中将Date.now 作为default 传递,则您正在传递该函数,并且mongoose 将在每次文档需要该属性的默认值时调用该函数。这会导致当前时间,文档创建时,被存储为该属性的值。
但是,如果您改为传递 Date.now(),则传递的是 Date.now() 返回的值,而不是函数。通过这样做,您的文档将获得当前时间,schema 创建时,作为该属性的默认值。这意味着您的文档将存储最新部署的时间,这可能不是您想要的。
如果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返回函数本身。
【讨论】:
default 的值是一个函数,它将被调用。有了这些知识,您现在将能够了解默认架构选项的更高级用例。
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(),您的默认值将设置为固定值(架构的创建时间)。