Date.now()和mongoose中的Date.now有什么区别?

22

我在mongoose模型中使用Date.now()Date.now,但是我有点困惑它们之间的区别。请问你能帮助我吗?

2个回答

41

我知道这是一个老问题,但是被接受的答案没有正确解释区别。它解释了行为上的区别,但没有解释它实际上的工作方式。

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则返回函数本身。


1
这个答案提供了重要的澄清,即如果mongoose模式default提供的值是一个函数,它将被调用。有了这个知识,您现在将能够理解更高级的默认模式选项用例。 - Patrick Fowler
你好,感谢您提供详细的答案。您能否再解释一下这句话的意思:“通过这样做,您的文档将获得当前时间(即模式创建时的时间)作为该属性的默认值。这意味着您的文档将存储最新部署的时间。”?我们所说的“模式创建时的时间”和“最新部署”具体指什么? - AG_HIHI

31

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()来设置默认值,会发生什么?我的意思是,我可以使用Date.now()来设置默认值吗? - Krishna joshi
14
在创建新记录时,Date.now将被Mongoose替换为当前日期时间,因此对于每个记录它都会改变。然而,如果您使用 Date.now(),则您的默认值将设置为一个固定值(模式的创建时间)。 - Alex
非常感谢你的回答 #Jaco - Krishna joshi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接