Meteor:如何使用 Momentjs 在 Mongodb 中添加和查询日期
Meteor: How to add and query Dates in Mongodb with Momentjs
我想显示今天到期的所有对象。一切都适用于我的夹具数据。但是新添加的对象不会显示。
夹具
...
var today = moment().toDate();
Cards.insert({
deckName: javascriptId,
due: today,
front: 'blaablaa',
back: 'blaablaablaa'
});
...
显示对象
Template.showCards.helpers({
cards: function () {
var end = moment().toDate();
return Cards.findOne({
deckName: this._id,
due: {"$lte": end}
});
}
添加新的截止日期以隐藏对象
Template.showCards.events({
...
'click #difficulty button': function(event) {
var incBy = parseInt(event.target.value);
console.log(incBy);
console.log(typeof incBy);
var today = moment();
var newDue = moment(today).add(incBy,'days').toDate();
Cards.update(
this._id, {
$set: {due: newDue}
}
);
}
});
添加新对象
Template.addCards.events({
'submit form': function (event, template) {
event.preventDefault();
var deckNameVar = event.target.deckName.value;
var frontVar = event.target.front.value;
var backVar = event.target.back.value;
var today = moment().toDate();
Cards.insert({
deckName: deckNameVar,
due: today,
front: frontVar,
back: backVar
});
}
});
新对象将正确添加到数据库中,但由于某些原因它们没有显示。
moment().toDate()
returns 一个 Date
对象,它指定了一个准确的时间时刻(例如 1/4/15 在 16:32:12),而不是结束或开始一天。存储截止日期时请记住这一点。
每当你的卡片助手运行时,它都会及时找到一个准确的时刻,并检查所有在该准确时刻到期的卡片。添加新卡片不会因为它们不符合条件而强制助手重新运行。换句话说,您的 end
不是反应性的,而且过于具体。
您只需将 end
设置为一天的实际结束时间即可解决此问题:
var end = moment().endOf('day').toDate();
此外,您的助手使用 findOne
而不是 find
,因此您只会得到一张卡片,而不是所有匹配选择器的卡片。如果您只想查看最后更新的卡片,请像这样修改您的助手:
return Cards.findOne({deckName: this._id, due: {$lte: end}}, {sort: {due: -1}});
最后,您需要解决加入套牌和卡牌的方式。在您的灯具中,您使用 deckName
的 id,然后在您的提交中使用甲板的名称,最后在您的 cards
帮助程序中,您通过 id 进行搜索。选择一种方式并坚持下去。我建议调用该字段 deckId
并仅使用 ID(请注意,这需要修复您的提交以按名称查找牌组,然后使用相应的 ID)。
我想显示今天到期的所有对象。一切都适用于我的夹具数据。但是新添加的对象不会显示。
夹具
...
var today = moment().toDate();
Cards.insert({
deckName: javascriptId,
due: today,
front: 'blaablaa',
back: 'blaablaablaa'
});
...
显示对象
Template.showCards.helpers({
cards: function () {
var end = moment().toDate();
return Cards.findOne({
deckName: this._id,
due: {"$lte": end}
});
}
添加新的截止日期以隐藏对象
Template.showCards.events({
...
'click #difficulty button': function(event) {
var incBy = parseInt(event.target.value);
console.log(incBy);
console.log(typeof incBy);
var today = moment();
var newDue = moment(today).add(incBy,'days').toDate();
Cards.update(
this._id, {
$set: {due: newDue}
}
);
}
});
添加新对象
Template.addCards.events({
'submit form': function (event, template) {
event.preventDefault();
var deckNameVar = event.target.deckName.value;
var frontVar = event.target.front.value;
var backVar = event.target.back.value;
var today = moment().toDate();
Cards.insert({
deckName: deckNameVar,
due: today,
front: frontVar,
back: backVar
});
}
});
新对象将正确添加到数据库中,但由于某些原因它们没有显示。
moment().toDate()
returns 一个 Date
对象,它指定了一个准确的时间时刻(例如 1/4/15 在 16:32:12),而不是结束或开始一天。存储截止日期时请记住这一点。
每当你的卡片助手运行时,它都会及时找到一个准确的时刻,并检查所有在该准确时刻到期的卡片。添加新卡片不会因为它们不符合条件而强制助手重新运行。换句话说,您的 end
不是反应性的,而且过于具体。
您只需将 end
设置为一天的实际结束时间即可解决此问题:
var end = moment().endOf('day').toDate();
此外,您的助手使用 findOne
而不是 find
,因此您只会得到一张卡片,而不是所有匹配选择器的卡片。如果您只想查看最后更新的卡片,请像这样修改您的助手:
return Cards.findOne({deckName: this._id, due: {$lte: end}}, {sort: {due: -1}});
最后,您需要解决加入套牌和卡牌的方式。在您的灯具中,您使用 deckName
的 id,然后在您的提交中使用甲板的名称,最后在您的 cards
帮助程序中,您通过 id 进行搜索。选择一种方式并坚持下去。我建议调用该字段 deckId
并仅使用 ID(请注意,这需要修复您的提交以按名称查找牌组,然后使用相应的 ID)。