我有一个简单的Meteor集合,我正在尝试插入一个包含momentjs属性的文档。所以我这样做:
docId = Col.insert({m: moment()});
但是,当我尝试用
重新获取此文档时doc = Col.findOne({_id: docId})
我得到了doc.m的“无效日期”,如下所示:
Object {_id: "wnHzTpHHxMSyMxmu3", m: "Invalid date"}
有人吗?!
答案 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 docs,Date
被序列化为整数时间戳:
{
"d": {"$date": 1358205756553}
}
所以 - 大卫的答案是现场(并且应该仍然是接受的答案)。但是,如果你做的不仅仅是获取当前的日期/时间,那么你可能想要使用它。您可以使用yourMoment.toDate()
并传递它,以便Meteor将其处理为EJSON格式的$date
类型。
答案 2 :(得分:0)
如果您想在find
和findOne
上设置时刻对象,请将其另存为日期,然后在找到它时对其进行转换。例如:
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()
});