Meteor:如何使用Momentjs在Mongodb中添加和查询日期

Meteor: How to add and query Dates in Mongodb with Momentjs

本文关键字:添加 查询 日期 Mongodb 何使用 Momentjs Meteor      更新时间:2023-09-26

我想显示今天到期的所有对象。使用我的夹具数据一切正常。但新添加的对象不会显示。

夹具

...
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()返回一个Date对象,该对象指定确切的时刻(例如 1/4/15 at 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}});

最后,您需要解决如何加入套牌和卡片。在您的灯具中,您使用 id 表示deckName,然后在提交中使用套牌的名称,最后在您的cards助手中,您通过 id 进行搜索。选择一种方式并坚持下去。我建议deckId调用该字段并仅使用 ids(请注意,这需要修复您的提交以按名称查找甲板,然后使用相应的 id)。