Как сделать это быстро при удалении документа в подсборке в Firestore после использования http триггера? - PullRequest
0 голосов
/ 08 сентября 2018

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

так ...

  1. сначала мне нужно запросить документы о событиях, которые прошли
  2. получить доступ к вложенной коллекции этого события, чтобы получить идентификаторы пользователей.
  3. удалить идентификатор события из подкатегории пользователей "likesEvents"
  4. окончательно удалить этот пропущенный документ события

пользователь 1wBZMVjxS0l5ass977c4 дает подобное событию N5zH0lauf7reNlV9qFe3

Коллекция событий: enter image description here

Коллекция пользователей: enter image description here

проблема в том, что выполнение этого действия занимает много времени:

Выполнение функции заняло 11656 мс, завершено кодом состояния: 200

У меня есть только одно событие, которое нужно удалить, но оно занимает 11 с. Я не знаю, нормально ли это, или, может быть, у меня плохой код, как показано ниже?

вот код, который я использую:

    export const cronJobDeletingPastEvents3456 = functions.https.onRequest(async (request,response) => {


    try {

        const db = admin.firestore()
        const dateNow = new Date()
        const pastEvents = await db.collection("events").where('dateTimeFinish', '<', dateNow).get()

        if (pastEvents.docs.length === 0) {
            response.send(" there are no events have passed recent date")
        } else {

            pastEvents.forEach(async snap => {

                const eventID = snap.data().eventID
                const likersSnapshots = await snap.ref.collection("likers").get()
                const likersDocuments = likersSnapshots.docs

                const likersIDs = []

                likersDocuments.forEach(likersSnap => {
                    const userIDLikers = likersSnap.data().userID
                    likersIDs.push(userIDLikers)
                })

                const promisesDeletingLikers = []

                likersIDs.forEach(likerUserId => {
                    const likersEventRef = db.collection('users').doc(likerUserId).collection('likedEvents').doc(eventID)
                    const p = likersEventRef.delete()
                    promisesDeletingLikers.push(p)

                })

                await Promise.all(promisesDeletingLikers)
                await snap.ref.delete() 

            })

            // send response
            response.send("Successfully performing cron job")

        }



    }
    catch (error) {
        response.status(500).send(error)
    }



})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...