Проблема
Здравствуйте, у меня проблема с выполнением запроса выборки в облачной функции Google в форме:
const query = await this.db.collection("myCollection")
.where("myId", "==", id)
.limit(1)
.get()
Вот более полный фрагмент кода ( в соответствии с просьбой):
async function handleWebhook(sid: string, unixSeconds: number){
const tBeforeFetch = performance.now()
const query = await this.db.collection("myCollection")
.where("myId", "==", sid)
.limit(1)
.get()
const tAfterFetch = performance.now()
console.debug(`Time to fetch event from store: ${(tAfterFetch - tBeforeFetch)}ms`)
if(query.empty || query.docs.length <= 0) {
return;
}
const dbResultDoc = query.docs[0];
const dbResult = dbResultDoc.data()
// update status
dbResult['status'] = 'ACTIVE'
const dataRef = this.db.collection("myCollection").doc(dbResultDoc.id)
const metaRef = dataRef.collection("myMetaCollection").doc("STATIC_KEY")
try {
await this.db.runTransaction(async trz => {
const metaDoc = await trz.get(metaRef)
const prevMetaUnixSeconds = metaDoc.exists ? metaDoc['unixSeconds'] : 0
if (unixSeconds < prevMetaUnixSeconds) {
console.warn(`Hook called us late`)
return
}
// update ts
metaDoc['unixSeconds'] = unixSeconds
await trz
.set(dataRef, dbResult)
.set(metaRef, metaDoc)
})
} catch(e) {
console.warn(`transcation has failed: `, e)
}
}
Часто этот запрос занимает около 90 секунд, и у меня нет веских причин, почему.
Что я пробовал
Отключение индексирования больших чисел
Я попытался разобраться, не было ли причиной автоматической индексации. Я отключил индексирование больших столбцов в этой коллекции, но улучшения не увидел.
Просмотр размера данных
Данные, которые я возвращаю, невелики по размеру. Всего несколько кб. Так что это не должно быть проблемой. Кроме того, я возвращаю только одну запись (идентификаторы уникальны).
На данный момент я весьма озадачен. Я рассматриваю вопрос об изменении хранилищ данных без каких-либо проблем. Есть указатели?