通过将日期索引与当前日期进行比较来删除集合中的所有文档

时间:2019-07-06 01:03:22

标签: arrays node.js mongodb express mongoose

问题摘要

我想对此有一个自信的实现,因为我真的不知道如何测试。由于此功能实际上仅在一定范围内具有长期使用的意义,但如果没有它,会让我感到不舒服。

我在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'中包含数组的文档。

1 个答案:

答案 0 :(得分:1)

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

示例:

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

或按日期删除:

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