Meteor new Date()对mongodb 3.0.1和autoform / simple schema无效

时间:2015-05-20 12:21:41

标签: mongodb date meteor meteor-autoform

我在使用具有defaultValue的SimpleSchema处理type: Date时遇到了麻烦。 在mongodb(3.0.1)中,日期条目具有启动流星线程的时间。预期的行为是将服务器上对象的插入日期“约会”。

LIB / schema.js

Schema.DateCol = new SimpleSchema({
  date: {
    type: Date,
    defaultValue: new Date()
  },
  dateModified: {
    type: Date,
    autoValue: function () { return new Date(); }
  }
});

的客户机/ home.html的

    {{> quickForm id="test" schema="Schema.DateCol" collection="DateCol" type="insert" }}

插入两个物体后进入mongo:

  • 流星线发布于“2015年5月20日星期三12:28:42 GMT + 0200(CEST)”
  • 两个对象都是在间隔的一分钟插入的:第一个在 “2015年5月20日星期三12:30:50 GMT + 0200(CEST)”和第二场“2015年5月20日星期三12:31:30 GMT + 0200(CEST)”
  • 两个对象的日期字段(defaultValue)为:“Wed May 20 2015 12:28:42 GMT + 0200(CEST)”

对象1

{
  "_id": "PuME9jWwJJiw9diSC",
  "date": new Date(1432117722634),
  "dateModified": new Date(1432117850366)
}

对象2:

{
  "_id": "qqHqkN4YapWDsFhxx",
  "date": new Date(1432117722634),
  "dateModified": new Date(1432117890380)
}

你将使用MongoDB 3.0.1(我在MongoDB 2.4上没有这个错误)将错误包含在存储库Github中: https://github.com/JVercout/meteor-defaultValue-date-errored

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

问题是,在运行创建模式的代码时,new Date()表达式会被计算一次。然后将该值用作defaultValue。之间没有区别:

var x = new SimpleSchema({
  date: {defaultValue: new Date(), ...}
});

var defaultDate = new Date();
var x = new SimpleSchema({
  date: {defaultValue: defaultDate, ...}
});

您似乎需要autoValue,因为看起来您可以使用defaultValue的函数。 Collection2 documentation实际上有一个使用autoValue用于"在"创建的示例领域。这取决于Collection2添加的字段,但我在你的git repo中看到你正在使用它。

// Force value to be current date (on server) upon insert
// and prevent updates thereafter.
createdAt: {
  type: Date,
  autoValue: function() {
    if (this.isInsert) {
      return new Date;
    } else if (this.isUpsert) {
      return {$setOnInsert: new Date};
    } else {
      this.unset();
    }
  }
}