【问题标题】:Removing all documents in a collection by comparing date index with current date通过将日期索引与当前日期进行比较来删除集合中的所有文档
【发布时间】:2019-11-16 12:40:14
【问题描述】:

问题总结

我希望对此有信心实现,因为我真的不知道如何测试它。因为这个功能确实只在一定范围内相关,并且适合长期使用,但如果我没有它会让我感到不舒服。

我的 Node.js/Express/Mongoose(MongoDB) REST APi 中有一个模型,它有一个日期索引(不是 Date.now,用户选择的日期)。在此模型的部分路线中,我希望能够根据不同的索引查询模型,但我想删除该查询中日期索引的日期早于当前日期的所有文档(Date.现在)。

我的尝试

我想出了一个解决方案,虽然它创建了一个应该删除的文档的 ID 数组,但我不知道如何通过该 ID 数组删除。

// @route  GET api/events/new/:course
// @desc   Find upcoming events based on the course
// @access Private
router.get('/new/:course', auth, async (req, res) => {
    try {
        // Query the events based on the course
        const events = await Event.find({course: req.params.course});

        let finishedEvents = [];
        let validEvents = [];

        // Find & Save the IDs of all events that aren't finished
        events.foreach(event => {
            if (Date.now < event.date) {
                validEvents.push(event);
            } else {
                finishedEvents.push(event.id);
            }
        });

        /** How do I delete 'finishedEvents' without any asynchronously-related issues,
         *  like i'm not sure mapping through 'finishedEvents' and removing them individually
         *  would work. Plus mongoose doesn't even have a 'deleteById' query type like it has
         *  'findById'. Could I just .deleteOne({ id: arrayElement }) ?
         */


        res.json(validEvents);


    } catch (err) {

        console.error(err.messsage);
        res.status(500).send('Server error');

    }
});

我应该返回“validEvents”中的事件数组,并删除“finishedEvents”中包含的数组的所有文档。

【问题讨论】:

    标签: arrays node.js mongodb express mongoose


    【解决方案1】:

    你可以在猫鼬中使用.deleteMany()

    示例:

    await Event.deleteMany({id: {$in: finishedEvents}});
    

    或按日期删除:

    await Event.deleteMany({date: {$gte: Date.now()}});
    

    【讨论】:

    • 我尝试了第二个,但我的目标是 $lte,它在 try/catch 中抛出错误,但是当我 console.error(err.message) 时,它只记录“未定义” .
    • 这是我的代码// @route GET api/events/new/:course // @desc Find upcoming events based on the course // @access Private router.get('/new/:course', auth, async (req, res) =&gt; { try { await Event.deleteMany({ date: { $lte: Date.now }}); const events = await Event.find({ course: req.params.course }); // Return the new events res.json(events); } catch (err) { console.error(err.messsage); res.status(500).send('Server error'); } });
    • 我的错。它应该是 Date.now()new Date() 而不是 Date.now。编辑了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2015-10-12
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多