Удаление всех документов в коллекции путем сравнения индекса даты с текущей датой - PullRequest
0 голосов
/ 06 июля 2019

Краткое описание проблемы

Я хочу иметь уверенную реализацию этого, поскольку я действительно не знаю, как бы это проверить. Поскольку эта функциональность действительно актуальна только в масштабе и для долгосрочного использования, но мне было бы неудобно, если бы ее не было.

У меня есть модель в моем REST APi Node.js / Express / Mongoose (MongoDB), и у нее есть индекс для даты (не Date.now, пользователь выбрал Date). В части моих маршрутов для этой модели я хочу иметь возможность запрашивать модель на основе другого индекса, но я хочу удалить все документы в этом запросе, где в индексе даты есть дата, предшествующая текущей дате (Date. в настоящее время).

Что я пробовал

Я придумала решение, хотя оно создает массив идентификаторов документов, которые должны быть удалены, и я не знаю, как удалить этот массив идентификаторов.

// @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' и удаляю все документы с массивом, содержащимся в 'finishEvents'.

1 Ответ

1 голос
/ 06 июля 2019

Вы можете использовать .deleteMany() в мангусте.

Пример:

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

Или удалить по дате:

await Event.deleteMany({date: {$gte: Date.now()}});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...