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

时间:2016-02-19 09:03:25

标签: node.js mongodb

我在mongoose模型中使用Date.now()Date.now

我对它们之间的区别感到有点困惑。你能帮我吗?

2 个答案:

答案 0 :(得分:9)

我知道这是一个老问题,但是被接受的答案并不能正确解释差异。它解释了行为上的差异,但没有解释其实际工作原理。

在您的mongoose模式中,您的default可以是指定类型的值,也可以是返回指定类型的值的函数。 Date.now是内置的Javascript函数,它以数字形式返回当前的unix时间戳。

如果在Date.now模式中将default作为mongoose传递,则说明您正在传递函数,并且mongoose会在每次文档需要默认值时调用该函数。对于那个财产。这样会导致当前时间(在创建文档 时)存储为该属性的值。

但是,如果您改为传递Date.now(),则将传递Date.now()返回的值,而不是函数。这样,您的文档将在 schema 创建时获得当前时间,作为该属性的默认值。这意味着您的文档将存储最新部署的时间,这可能不是您想要的。

如果Date.now是一个常量,如接受的答案所建议,“用猫鼬在创建新记录时将其替换为当前日期时间”,则以下内容应在逻辑上起作用:

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 :(得分:8)

可以在Mongoose架构定义中使用

Date.now来设置字段的默认值,而createdDate是JavaScript的等效值。例如,在架构定义中设置默认值时,使用var mongoose = require('mongoose'); var Schema = mongoose.Schema; //schema var yourSchema= new Schema({ text: {type: String}, createdAt: {type: Date, default: Date.now} }); 。使用此架构定义,Mongoose将使用当前时间填充Date.now()

yourSchema.pre('save', function doSomething(next){
   var something = this;
   something.createdAt(Date.now());
   next();
 });

但是,在针对您的架构编写JavaScript代码时,您必须使用vector<int> arr[N];

vector<vector<int> > N vs vector<int> F[N]