GoLang Firestore慢速批处理写入



我使用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秒,如果我们需要更新500000个条目,这是不合适的。我想知道这1/2秒是否是Firestore的正常响应时间,以及如何优化此查询?

如果您需要更新与查询匹配的所有文档,而不需要更新其中的任何值,那么一个优化就是要求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.Select

如果您的集合中的文档在索引字段中包含顺序值,则这是正常的,但以上优化仍然适用:

文档包含的集合的最大写入速率索引字段中的顺序值:每秒500

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

最新更新