Как эффективно удалить старые документы Firebase Cloud с помощью функции Google Cloud? - PullRequest
0 голосов
/ 24 марта 2020

В настоящее время я использую следующую запланированную облачную функцию для удаления любых назначений или обязанностей (документов) старше 24 часов. Функция работает нормально, и документы успешно удаляются.

Однако, ОГРОМНОЕ количество Чтений сообщается функцией. Кажется, что каждое отдельное задание или обязанность «читается», независимо от того, нужно ли это удалять или нет. Насколько я понимаю, запросы считаются чтением, если они не возвращают документ в используемом querySnapshot? Например, любые документы, которые будут удалены, будут иметь READ и DELETE.

Кто-нибудь знает, как оптимизировать это, чтобы читать только те документы, которые должны быть удалены? Или есть более простой способ удаления старых документов Cloud Firebase с помощью функции Google Cloud? Я бы подумал, что это действительно распространенная вещь.

* ОБНОВЛЕНО # 2 с collectionGroup и правильным использованием Promises (Спасибо за вашу помощь!) *

Та же проблема: при запуске функции отображается 844 операций чтения и 1 удаления. Определенно нет других источников, читающих данные. Пики возникают только сразу после запуска функции (с помощью Google Cloud Scheduler - Run Now)

Интересно, что если НЕТ документов для удаления, то НЕТ записанных чтений. Но если есть> 1 документ для удаления, существуют сотни операций чтения. В настоящее время в коллекции всего около 120 обязанностей! Кажется, что каждая обязанность читается несколько раз!?

Reads Spike right after the function runs

enter image description here

Спасибо!

exports.scheduledCleanOldDutiesCollection = functions.pubsub.schedule('0 3 * * *')
    .timeZone('America/Chicago')
    .onRun((context) => {
        const dateYesterday = new Date(new Date().getTime() - (24 * 60 * 60 * 1000));   // 24 hours
        return db.collectionGroup('duties').where('date', '<', dateYesterday).get()
            .then(querySnapshot => {
                const promises = [];
                querySnapshot.forEach(doc => {
                    promises.push(doc.ref.delete());
                });
                return Promise.all(promises);
            });
    });

1 Ответ

1 голос
/ 24 марта 2020

Как объяснил Дуг в своем комментарии и в официальной серии видео , ваш код должен возвращать обещание, которое разрешается только после завершения всей асинхронной работы, в противном случае функция Cloud будет завершена досрочно.

Вы можете изменить свой код следующим образом, используя Promise.all():

exports.scheduledCleanOldDutiesCollection = functions.pubsub.schedule('0 3 * * *')
    .timeZone('America/Chicago')
    .onRun((context) => {
        const dateYesterday = new Date(new Date().getTime() - (24 * 60 * 60 * 1000));   // 24 hours
        return db.collectionGroup('duties').where('date', '<', dateYesterday).get()
            .then(querySnapshot => {
                const promises = [];
                querySnapshot.forEach(doc => {
                    promises.push(doc.ref.delete());
                });
                return Promise.all(promises);
            });
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...