在Meteor Collection中插入一个momentjs对象

时间:2014-01-05 18:31:07

标签: mongodb meteor momentjs

我有一个简单的Meteor集合,我正在尝试插入一个包含momentjs属性的文档。所以我这样做:

docId = Col.insert({m: moment()});

但是,当我尝试用

重新获取此文档时
doc = Col.findOne({_id: docId})

我得到了doc.m的“无效日期”,如下所示:

Object {_id: "wnHzTpHHxMSyMxmu3", m: "Invalid date"}

有人吗?!

3 个答案:

答案 0 :(得分:25)

我强烈建议将日期存储为Date个对象,并在获取后使用片刻格式化它们。例如:

Posts.insert({message: 'hello', createdAt: new Date});

稍后当您想要显示日期时:

var date = Posts.findOne().createdAt;
moment(date).format('MMMM DD, YYYY');

答案 1 :(得分:4)

时刻不能直接序列化。他们无法在往返JSON的往返途中生存。最好的方法是序列化ISO8601格式的日期,例如使用moment().toISOString()moment().format()。 (toISOString是首选,但将以UTC而非本地+偏移量存储。

然后,您可以使用moment(theString)解析该字符串,并从那里执行您想要的操作。

大卫的回答也是正确的。虽然它依赖于Metor的默认机制来序列化Date个对象,但Date也不能直接存在于JSON中。我不知道Meteor的具体细节 - 但它可能是存储整数时间戳还是只使用Date.toString()。 ISO8601格式比其中任何一种都更适合JSON。

<强>更新

我只是看了一眼Meteor的文档,它解释说他们使用了一种名为“EJSON”的发明格式。 (你可能知道这一点,但这对我来说是新的。)

根据these docsDate被序列化为整数时间戳:

{
  "d": {"$date": 1358205756553}
}

所以 - 大卫的答案是现场(并且应该仍然是接受的答案)。但是,如果你做的不仅仅是获取当前的日期/时间,那么你可能想要使用它。您可以使用yourMoment.toDate()并传递它,以便Meteor将其处理为EJSON格式的$date类型。

答案 2 :(得分:0)

如果您想在findfindOne上设置时刻对象,请将其另存为日期,然后在找到它时对其进行转换。例如:

Posts = new Mongo.Collection('posts', {
  transform: function (doc) {
    Object.keys(doc).forEach(field => {
      if (doc[field] instanceof Date) {
        doc[field] = moment(doc[field]);
      }
    });
    return doc;
  }
});

Posts.insert({
  title: 'Hello',
  createdAt: new Date()
});