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

Posted

技术标签:

【中文标题】通过将日期索引与当前日期进行比较来删除集合中的所有文档【英文标题】: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”中包含的数组的所有文档。

【问题讨论】:

【参考方案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。编辑了我的答案。

以上是关于通过将日期索引与当前日期进行比较来删除集合中的所有文档的主要内容,如果未能解决你的问题,请参考以下文章

我如何将当前日期与日期选择器中的用户输入日期进行比较

将修改后的文件日期与批处理文件中的当前日期进行比较

将日期和时间与 MySQL 中的当前时间进行比较

通过从 SQL Server 中的当前日期删除超过 180 天的所有记录来清除

如何通过与 Flutter Cloud Firestore 插件中的日期进行比较来获取记录?

有没有办法将当前日期与以 VARCHAR 格式存储在数据库中的日期进行比较?