GoLang Firestore медленная пакетная запись - PullRequest
0 голосов
/ 03 мая 2020

Я использую Golang с Firestore для чтения / записи / обновления информации при пакетной записи. Мой код следующий:

t0 := time.Now()
    iter := client.Collection("subs").Where("some key", "==", lookup).Limit(499).Documents(ctx)
    defer iter.Stop()
    batch := client.Batch()
    i := 0
    for {
        sub, err := iter.Next()
        if err == iterator.Done {
            break
        }
        i++
        sfRef := client.Collection("subs").Doc(sub.Ref.ID)
        batch.Set(sfRef, map[string]interface{}{
            "some key": update_value,
        }, firestore.MergeAll)
    }
    commit, err := batch.Commit(ctx)

Это пакетное обновление требует около 1/2 se c, что не подходит, если нам нужно обновить 500 000 записей. Мне интересно, является ли это 1/2 se c нормальным временем отклика для Firestore и как я могу оптимизировать этот запрос?

1 Ответ

0 голосов
/ 07 мая 2020

Одна оптимизация, если вам нужно обновить все документы, которые соответствуют вашему запросу, независимо от какого-либо значения в нем, это попросить у firestore никаких полей вообще:

iter := client.Collection("subs").Select().Where("some key", "==", lookup).Limit(499).Documents(ctx)

https://pkg.go.dev/cloud.google.com/go/firestore?tab=doc#Query. Выберите

Если в вашей коллекции есть документы, содержащие последовательные значения в индексированном поле, это нормально, но все же применяется вышеописанная оптимизация:

Максимальная скорость записи в коллекцию, в которой документы содержат последовательные значения в индексированном поле: 500 в секунду

https://firebase.google.com/docs/firestore/quotas#writes_and_transactions

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