{
    "componentChunkName": "component---src-templates-post-js",
    "path": "/firestoren-write/",
    "result": {"data":{"ghostPost":{"id":"Ghost__Post__6103f3e53986b000013a44b3","title":"Firestoreの書き込み速度の検証","slug":"firestoren-write","featured":false,"feature_image":null,"excerpt":"結論\n1つのcollectionに大量のdocumentを一括書き込みする際、500件のバッチ書き込みを20並列で実行したところ、以下の時間で完了した。\n\n\n\nFirestoreの書き込み制限\nFirestoreは書き込み時にいくつかの制限があります。詳しくは\nhttps://firebase.google.com/docs/firestore/quotas\n[https://firebase.google.com/docs/firestore/quotas?hl=ja] にあります。\n\n今回気になったのは4番目の制限です。ある条件下では1つのcollectionに対するdocumentの書き込みは 1秒間に500件が上限、という事です。\n\n※2022/05/11 追記\n\n制限について、以下のように変更されていました。「できなくは無いがパフォーマンスが悪くなるかも」という閾値のようです。\n\n\n\nあるシステムのパフォーマンス調査をしていて、この上限のせいで遅くなってるかも？という話になりました。書き込み速度について調べていると以下の記事を見つけました。\n\nFirestoreに負荷試験(L","custom_excerpt":null,"visibility":"public","created_at_pretty":"30 July, 2021","published_at_pretty":"31 July, 2020","updated_at_pretty":"11 May, 2022","created_at":"2021-07-30T21:43:17.000+09:00","published_at":"2020-08-01T00:00:00.000+09:00","updated_at":"2022-05-11T10:18:02.000+09:00","meta_title":null,"meta_description":null,"og_description":null,"og_image":null,"og_title":null,"twitter_description":null,"twitter_image":null,"twitter_title":null,"authors":[{"name":"Yu Takahashi","slug":"yu","bio":null,"profile_image":null,"twitter":null,"facebook":null,"website":null}],"primary_author":{"name":"Yu Takahashi","slug":"yu","bio":null,"profile_image":null,"twitter":null,"facebook":null,"website":null},"primary_tag":{"name":"Firestore","slug":"firestore","description":null,"feature_image":null,"meta_description":null,"meta_title":null,"visibility":"public"},"tags":[{"name":"Firestore","slug":"firestore","description":null,"feature_image":null,"meta_description":null,"meta_title":null,"visibility":"public"},{"name":"golang","slug":"golang","description":null,"feature_image":null,"meta_description":null,"meta_title":null,"visibility":"public"}],"plaintext":"結論\n1つのcollectionに大量のdocumentを一括書き込みする際、500件のバッチ書き込みを20並列で実行したところ、以下の時間で完了した。\n\n\n\nFirestoreの書き込み制限\nFirestoreは書き込み時にいくつかの制限があります。詳しくは\nhttps://firebase.google.com/docs/firestore/quotas\n[https://firebase.google.com/docs/firestore/quotas?hl=ja] にあります。\n\n今回気になったのは4番目の制限です。ある条件下では1つのcollectionに対するdocumentの書き込みは 1秒間に500件が上限、という事です。\n\n※2022/05/11 追記\n\n制限について、以下のように変更されていました。「できなくは無いがパフォーマンスが悪くなるかも」という閾値のようです。\n\n\n\nあるシステムのパフォーマンス調査をしていて、この上限のせいで遅くなってるかも？という話になりました。書き込み速度について調べていると以下の記事を見つけました。\n\nFirestoreに負荷試験(Loadroid)してみた+補足 - Qiitaこちらの記事は，Firebase.yebisu\n#1のLTに補足解説を加えたものになります．発表スライド当日お話できなかった，実施する際の注意などもありますので，ごさしゅーください． tl;dr\n高頻度のドキュメント作成（自...QiitaYatima\n[https://qiita.com/Yatima/items/2abb633191080ee1447c?utm_content=buffera86fe&utm_medium=social&utm_source=facebook.com&utm_campaign=buffer]\nこの記事では10秒間で70,000件のdocumentの登録に成功されたようです。負荷を少しずつ上げていけば 500/s\nの制限を超えられるみたいです。少しずつ負荷を上げるとスケールできることは以下に書いてあります。\n\nCloud Firestore のベスト プラクティス | FirebaseFirebase\n[https://firebase.google.com/docs/firestore/best-practices?hl=ja#ramping_up_traffic]\nどのような条件の時に 500/s の制限に引っかかるのか気になったので試してみることにしました。\n\n環境\n * Google Compute Engine、e2-medium (2 vCPU、4GB メモリ)\n * Ubuntu 20.04 LTS\n * Docker 19.03.13\n * Golang 1.14.9\n * cloud.google.com/go/firestore 1.3.0\n\n負荷を徐々に上げてみる\n上の記事を参考に、以下のような処理を書いて試してみました。\n\n500件のバッチ書き込みを実行\n=> 500件のバッチ書き込みを2並列で実行\n=> 500件のバッチ書き込みを4並列で実行\n=> 500件のバッチ書き込みを8並列で実行\n=> (10,000件まで繰り返す)\n\nコード全体は以下になります。3つの変数（一度のバッチ書き込みの件数、登録件数、初回書き込み時の並列数）を変えられるように実装しました。\n\npackage main import ( \"context\" \"flag\" \"fmt\" \"log\" \"os\" \"strconv\" \"sync\" \"time\" \n\"cloud.google.com/go/firestore\" ) var ( size = flag.Int(\"size\", 0, \"chunk size\") \ntotal = flag.Int(\"total\", 0, \"total count\") multi = flag.Int(\"multi\", 0, \"multi\"\n) ) func main() { flag.Parse() ctx := context.Background() client, err := \nfirestore.NewClient(ctx, os.Getenv(\"PROJECT_ID\")) if err != nil { log.Fatal(err) \n} data := generateDocumentData(client) fmt.Println(\"create\") exec(ctx, client, \ndata, create) fmt.Println(\"update\") exec(ctx, client, data, update) // exec(ctx,\nclient, data, updateIncrement) // exec(ctx, client, data, updateArrayUnion) //\nexec(ctx, client, data, updateServerTimestamp) fmt.Println(\"read\") read(ctx, \nclient.Collection(\"articles\")) // fmt.Println(\"delete\") // exec(ctx, client,\ndata, delete) } func panicIf(err error) { if err != nil { panic(err) } } func \ngenerateDocumentData(client *firestore.Client) []map[*firestore.DocumentRef]map[\nstring]interface{} { limit := *size totalCount := *total count := totalCount/\nlimit + 1 data := make([]map[*firestore.DocumentRef]map[string]interface{}, 0, \ncount) col := client.Collection(\"articles\") for j := 0; j < count; j++ { min := \nlimit * j max := limit * (j + 1) if max > totalCount { max = totalCount } if min \n == max { break } results := make(map[*firestore.DocumentRef]map[string]\ninterface{}, limit) for i := min; i < max; i++ { doc := col.NewDoc() results[doc\n] = map[string]interface{}{ \"title\": \"title_\" + strconv.FormatInt(int64(i), 10), \n\"tags\": []string{\"tag_1\", \"tag_2\", \"tag_3\"}, \"author_id\": \"author_id_\" + strconv\n.FormatInt(int64(i), 10), \"view_count\": i, \"is_published\": true, \"text\": \n\"0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789\"\n, // \"update_timestamp\": firestore.ServerTimestamp, } } data = append(data, \nresults) } return data } func exec(ctx context.Context, client *firestore.Client\n, data []map[*firestore.DocumentRef]map[string]interface{}, execFunc func(ctx \ncontext.Context, client *firestore.Client, col *firestore.CollectionRef, \narticles map[*firestore.DocumentRef]map[string]interface{})) { col := client.\nCollection(\"articles\") fmt.Println(\"start\") start := time.Now() multi := *multi \ndataLen := len(data) current := 0 for { wg := &sync.WaitGroup{} for i := 0; i < \nmulti; i++ { articles := data[current] wg.Add(1) go func() { execFunc(ctx, \nclient, col, articles) wg.Done() }() current++ if dataLen == current { break } } \nwg.Wait() if dataLen == current { break } multi *= 2 } fmt.Println(time.Now().\nSub(start)) fmt.Println(\"end\") last, err := col.OrderBy(\"view_count\", firestore.\nDesc).Limit(1).Documents(ctx).GetAll() panicIf(err) if len(last) > 0 { fmt.\nPrintln(last[0].Data()[\"view_count\"]) } } func create(ctx context.Context, \nclient *firestore.Client, col *firestore.CollectionRef, articles map[*firestore.\nDocumentRef]map[string]interface{}) { batch := client.Batch() for doc, article \n:= range articles { batch.Create(doc, article) } _, err := batch.Commit(ctx) \npanicIf(err) } func update(ctx context.Context, client *firestore.Client, col *\nfirestore.CollectionRef, articles map[*firestore.DocumentRef]map[string]\ninterface{}) { batch := client.Batch() for col, article := range articles { \nbatch.Update(col, []firestore.Update{ {Path: \"title\", Value: article[\"title\"].(\nstring) + \"_update\"}, {Path: \"view_count\", Value: article[\"view_count\"].(int) + \n10000}, }) } _, err := batch.Commit(ctx) panicIf(err) } func updateIncrement(ctx \ncontext.Context, client *firestore.Client, col *firestore.CollectionRef, \narticles map[*firestore.DocumentRef]map[string]interface{}) { batch := client.\nBatch() for col := range articles { batch.Update(col, []firestore.Update{ {Path: \n\"view_count\", Value: firestore.Increment(10000)}, }) } _, err := batch.Commit(\nctx) panicIf(err) } func updateArrayUnion(ctx context.Context, client *\nfirestore.Client, col *firestore.CollectionRef, articles map[*firestore.\nDocumentRef]map[string]interface{}) { batch := client.Batch() for col := range \narticles { batch.Update(col, []firestore.Update{ {Path: \"tags\", Value: firestore\n.ArrayUnion(\"tag_3\", \"tag_4\")}, }) } _, err := batch.Commit(ctx) panicIf(err) } \nfunc updateServerTimestamp(ctx context.Context, client *firestore.Client, col *\nfirestore.CollectionRef, articles map[*firestore.DocumentRef]map[string]\ninterface{}) { batch := client.Batch() for col := range articles { batch.Update(\ncol, []firestore.Update{ {Path: \"update_timestamp\", Value: firestore.\nServerTimestamp}, }) } _, err := batch.Commit(ctx) panicIf(err) } func delete(\nctx context.Context, client *firestore.Client, col *firestore.CollectionRef, \narticles map[*firestore.DocumentRef]map[string]interface{}) { batch := client.\nBatch() for col := range articles { batch.Delete(col) } _, err := batch.Commit(\nctx) panicIf(err) } func read(ctx context.Context, col *firestore.CollectionRef)\n{ fmt.Println(\"start\") start := time.Now() last, err := col.Where(\"view_count\", \n\">=\", 10000).Documents(ctx).GetAll() fmt.Println(time.Now().Sub(start)) fmt.\nPrintln(\"end\") fmt.Println(\"count: \", len(last)) panicIf(err) } view raw\n[https://gist.github.com/yutakahashi114/f2452c02c5bf762daa39afeb04afe5eb/raw/e24aec530289ded32f30e290845d22e3a0bfe0b3/firestore_limit_test.go]\n firestore_limit_test.go\n[https://gist.github.com/yutakahashi114/f2452c02c5bf762daa39afeb04afe5eb#file-firestore_limit_test-go]\nhosted with ❤ by GitHub [https://github.com] \n3つの変数のうち登録件数は10,000件で固定し、一度のバッチ書き込みの件数、初回書き込み時の並列数を適当に変えて時間を測ってみました。結果は以下になります。\n\n\n\n500/s を大きく超えて最大 9407/s\n出てました。実はそんなに気にしなくても大丈夫なのでしょうか。連続で試行したので既に十分スケールしていたのかもしれません。\n\n500/s に引っかかるのはどんな条件？\n公式ドキュメントには条件として以下のように書かれています。\n\n> Maximum write rate to a collection in which documents contain sequential values\nin an indexed field\n\n\nIncrement 関数を使った更新が影響するのかと思い試しました。ついでにArrayUnion や ServerTimestamp\nも試してみました。登録件数は10,000件で固定です。結果は以下になります。\n\n\n\n殆ど変わりませんでした。逆にどうやったら引っかかるのでしょうか？\n\nそもそも負荷を徐々にあげる必要があるのか？\n色々試したくなってきたので、最初から負荷を高めで固定してみました。\n\nfunc exec2(ctx context.Context, client *firestore.Client, data []map[*firestore.\nDocumentRef]map[string]interface{}, execFunc func(ctx context.Context, client *\nfirestore.Client, col *firestore.CollectionRef, articles map[*firestore.\nDocumentRef]map[string]interface{})) { col := client.Collection(\"articles\") fmt.\nPrintln(\"start\") start := time.Now() multi := *multi limit := make(chan struct\n{}, multi) wg := &sync.WaitGroup{} for _, articles := range data { limit <- \nstruct{}{} wg.Add(1) go func(articles map[*firestore.DocumentRef]map[string]\ninterface{}) { execFunc(ctx, client, col, articles) <-limit wg.Done() }(articles\n) } wg.Wait() fmt.Println(time.Now().Sub(start)) fmt.Println(\"end\") last, err := \n col.OrderBy(\"view_count\", firestore.Desc).Limit(1).Documents(ctx).GetAll() \npanicIf(err) if len(last) > 0 { fmt.Println(last[0].Data()[\"view_count\"]) } } \nview raw\n[https://gist.github.com/yutakahashi114/93c8561b788bf638c7f0e13a88f20d51/raw/1f690cca8034fcd76bf436d5b931625a8f7e9b6b/firestore_limit_test_2.go]\n firestore_limit_test_2.go\n[https://gist.github.com/yutakahashi114/93c8561b788bf638c7f0e13a88f20d51#file-firestore_limit_test_2-go]\nhosted with ❤ by GitHub [https://github.com] \n単純な並列化に変更しました。こちらも登録件数は10,000件で固定しています。結果は以下になります。\n\n\n\nさらに速くなりました。本当に計測方法が合っているのか不安になってきました。一応更新後に件数を確認し、更新されていることを確認しました。こちらも連続で試行していたので、既に十分スケールしていたのかもしれません。\n\n以後の計測は負荷を徐々に上げず、単純な並列化で試しています。\n\n削除の速度も測りました。あまり重視していないので1条件だけです。(最初から測定しておけばよかった）\n\n\n\n更新より少し遅いくらいでした。\n\n最大何件まで成功するか\n登録件数を変えていくつか試してみました。効果があるか分かりませんが、1条件ごとに2,3時間おいて試しました。結果は以下になります。\n\n\n\n40,000件は成功、50,000件は登録中にエラーとなりました。エラーが起きた後に確認しましたが、49,000件くらいまでは登録できていました。\n\nリクエスト数を2倍にしてみる\n最後にインスタンスをもう一台立て、2つのインスタンスでほぼ同時に実行してみました。\n\n\n\n40,000件 * 2 までは遅くなっているものの成功、50,000件 * 2 の更新で両方エラーになりました。思ったよりだいぶ耐えました。\n\nまとめ\n予想以上に書き込み可能件数が多かったです。自分で調べておいて何ですが合っているか不安なので、どこか間違ってたら教えていただけると非常に助かります。","html":"<!--kg-card-begin: markdown--><h2 id=\"%E7%B5%90%E8%AB%96\">結論</h2>\n<p>1つのcollectionに大量のdocumentを一括書き込みする際、500件のバッチ書き込みを20並列で実行したところ、以下の時間で完了した。</p>\n<p><img src=\"https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-11-10.11.13.png\" alt=\"----------2022-05-11-10.11.13\" loading=\"lazy\"></p>\n<h2 id=\"firestore%E3%81%AE%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%81%BF%E5%88%B6%E9%99%90\">Firestoreの書き込み制限</h2>\n<p>Firestoreは書き込み時にいくつかの制限があります。詳しくは<a href=\"https://firebase.google.com/docs/firestore/quotas?hl=ja\">https://firebase.google.com/docs/firestore/quotas</a> にあります。</p>\n<p>今回気になったのは4番目の制限です。<strong>ある条件下では1つのcollectionに対するdocumentの書き込みは 1秒間に500件が上限</strong>、という事です。</p>\n<p>※2022/05/11 追記</p>\n<p>制限について、以下のように変更されていました。「できなくは無いがパフォーマンスが悪くなるかも」という閾値のようです。</p>\n<p><img src=\"https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-11-10.14.04.png\" alt=\"----------2022-05-11-10.14.04\" loading=\"lazy\"></p>\n<p>あるシステムのパフォーマンス調査をしていて、この上限のせいで遅くなってるかも？という話になりました。書き込み速度について調べていると以下の記事を見つけました。</p>\n<!--kg-card-end: markdown--><figure class=\"kg-card kg-bookmark-card\"><a class=\"kg-bookmark-container\" href=\"https://qiita.com/Yatima/items/2abb633191080ee1447c?utm_content&#x3D;buffera86fe&amp;utm_medium&#x3D;social&amp;utm_source&#x3D;facebook.com&amp;utm_campaign&#x3D;buffer\"><div class=\"kg-bookmark-content\"><div class=\"kg-bookmark-title\">Firestoreに負荷試験(Loadroid)してみた+補足 - Qiita</div><div class=\"kg-bookmark-description\">こちらの記事は，Firebase.yebisu #1のLTに補足解説を加えたものになります．発表スライド当日お話できなかった，実施する際の注意などもありますので，ごさしゅーください． tl;dr 高頻度のドキュメント作成（自...</div><div class=\"kg-bookmark-metadata\"><img class=\"kg-bookmark-icon\" src=\"https://cdn.qiita.com/assets/favicons/public/apple-touch-icon-ec5ba42a24ae923f16825592efdc356f.png\"><span class=\"kg-bookmark-author\">Qiita</span><span class=\"kg-bookmark-publisher\">Yatima</span></div></div><div class=\"kg-bookmark-thumbnail\"><img src=\"https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-1150d8b18a7c15795b701a55ae908f94.png?ixlib&#x3D;rb-4.0.0&amp;w&#x3D;1200&amp;mark64&#x3D;aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTg0MCZoPTM4MCZ0eHQ2ND1SbWx5WlhOMGIzSmw0NEdyNkxLZzZJMjM2S21tNmFpVEtFeHZZV1J5YjJsa0tlT0JsLU9CcHVPQnYtT0JueXZvbzV6b3RyTSZ0eHQtY29sb3I9JTIzMzMzJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTU0JnR4dC1jbGlwPWVsbGlwc2lzJnR4dC1hbGlnbj1jZW50ZXIlMkNtaWRkbGUmcz03OTFiNDk4MzJhM2JmNjY0YmRlMmVjOWZkYTE4N2ExNA&amp;mark-align&#x3D;center%2Cmiddle&amp;blend64&#x3D;aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTg0MCZoPTUwMCZ0eHQ2ND1RRmxoZEdsdFlRJnR4dC1jb2xvcj0lMjMzMzMmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9NDUmdHh0LWFsaWduPXJpZ2h0JTJDYm90dG9tJnM9Yjk3NGQ4YzE0MTkwZGM4N2M5MDBlM2EwYjViYzQ2MjI&amp;blend-align&#x3D;center%2Cmiddle&amp;blend-mode&#x3D;normal&amp;s&#x3D;c8821aef00f52ee4a9157d66992585af\"></div></a></figure><p>この記事では10秒間で70,000件のdocumentの登録に成功されたようです。負荷を少しずつ上げていけば 500/s の制限を超えられるみたいです。少しずつ負荷を上げるとスケールできることは以下に書いてあります。</p><figure class=\"kg-card kg-bookmark-card\"><a class=\"kg-bookmark-container\" href=\"https://firebase.google.com/docs/firestore/best-practices?hl&#x3D;ja#ramping_up_traffic\"><div class=\"kg-bookmark-content\"><div class=\"kg-bookmark-title\">Cloud Firestore のベスト プラクティス | Firebase</div><div class=\"kg-bookmark-description\"></div><div class=\"kg-bookmark-metadata\"><img class=\"kg-bookmark-icon\" src=\"https://www.gstatic.com/devrel-devsite/prod/v854c54f3442b5b06d97cb2bf43f3647f489796c80c33899ecd29b91ae5303388/firebase/images/touchicon-180.png\"><span class=\"kg-bookmark-author\">Firebase</span></div></div><div class=\"kg-bookmark-thumbnail\"><img src=\"https://www.gstatic.com/devrel-devsite/prod/v854c54f3442b5b06d97cb2bf43f3647f489796c80c33899ecd29b91ae5303388/firebase/images/lockup.png\"></div></a></figure><!--kg-card-begin: markdown--><p>どのような条件の時に 500/s の制限に引っかかるのか気になったので試してみることにしました。</p>\n<h2 id=\"%E7%92%B0%E5%A2%83\">環境</h2>\n<ul>\n<li>Google Compute Engine、e2-medium (2 vCPU、4GB メモリ)</li>\n<li>Ubuntu 20.04 LTS</li>\n<li>Docker 19.03.13</li>\n<li>Golang 1.14.9</li>\n<li>cloud.google.com/go/firestore 1.3.0</li>\n</ul>\n<h2 id=\"%E8%B2%A0%E8%8D%B7%E3%82%92%E5%BE%90%E3%80%85%E3%81%AB%E4%B8%8A%E3%81%92%E3%81%A6%E3%81%BF%E3%82%8B\">負荷を徐々に上げてみる</h2>\n<p>上の記事を参考に、以下のような処理を書いて試してみました。</p>\n<p>500件のバッチ書き込みを実行<br>\n=&gt; 500件のバッチ書き込みを2並列で実行<br>\n=&gt; 500件のバッチ書き込みを4並列で実行<br>\n=&gt; 500件のバッチ書き込みを8並列で実行<br>\n=&gt; (10,000件まで繰り返す)</p>\n<p>コード全体は以下になります。3つの変数（一度のバッチ書き込みの件数、登録件数、初回書き込み時の並列数）を変えられるように実装しました。</p>\n<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src=\"https://gist.github.com/yutakahashi114/f2452c02c5bf762daa39afeb04afe5eb.js\"></script>-->\n<link rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css\">\n<div id=\"gist105569020\" class=\"gist\">\n    <div class=\"gist-file\" translate=\"no\">\n      <div class=\"gist-data\">\n        <div class=\"js-gist-file-update-container js-task-list-container file-box\">\n  <div id=\"file-firestore_limit_test-go\" class=\"file my-2\">\n    \n  <div itemprop=\"text\" class=\"Box-body p-0 blob-wrapper data type-go  \">\n\n      \n<table class=\"highlight tab-size js-file-line-container\" data-tab-size=\"8\" data-paste-markdown-skip>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L1\" class=\"blob-num js-line-number\" data-line-number=\"1\"></td>\n        <td id=\"file-firestore_limit_test-go-LC1\" class=\"blob-code blob-code-inner js-file-line\"><span class=pl-k>package</span> main</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L2\" class=\"blob-num js-line-number\" data-line-number=\"2\"></td>\n        <td id=\"file-firestore_limit_test-go-LC2\" class=\"blob-code blob-code-inner js-file-line\">\n</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L3\" class=\"blob-num js-line-number\" data-line-number=\"3\"></td>\n        <td id=\"file-firestore_limit_test-go-LC3\" class=\"blob-code blob-code-inner js-file-line\"><span class=pl-k>import</span> (</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L4\" class=\"blob-num js-line-number\" data-line-number=\"4\"></td>\n        <td id=\"file-firestore_limit_test-go-LC4\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s>&quot;context&quot;</span></td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L5\" class=\"blob-num js-line-number\" data-line-number=\"5\"></td>\n        <td id=\"file-firestore_limit_test-go-LC5\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s>&quot;flag&quot;</span></td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L6\" class=\"blob-num js-line-number\" data-line-number=\"6\"></td>\n        <td id=\"file-firestore_limit_test-go-LC6\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s>&quot;fmt&quot;</span></td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L7\" class=\"blob-num js-line-number\" data-line-number=\"7\"></td>\n        <td id=\"file-firestore_limit_test-go-LC7\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s>&quot;log&quot;</span></td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L8\" class=\"blob-num js-line-number\" data-line-number=\"8\"></td>\n        <td id=\"file-firestore_limit_test-go-LC8\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s>&quot;os&quot;</span></td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L9\" class=\"blob-num js-line-number\" data-line-number=\"9\"></td>\n        <td id=\"file-firestore_limit_test-go-LC9\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s>&quot;strconv&quot;</span></td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L10\" class=\"blob-num js-line-number\" data-line-number=\"10\"></td>\n        <td id=\"file-firestore_limit_test-go-LC10\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s>&quot;sync&quot;</span></td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L11\" class=\"blob-num js-line-number\" data-line-number=\"11\"></td>\n        <td id=\"file-firestore_limit_test-go-LC11\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s>&quot;time&quot;</span></td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L12\" class=\"blob-num js-line-number\" data-line-number=\"12\"></td>\n        <td id=\"file-firestore_limit_test-go-LC12\" class=\"blob-code blob-code-inner js-file-line\">\n</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L13\" class=\"blob-num js-line-number\" data-line-number=\"13\"></td>\n        <td id=\"file-firestore_limit_test-go-LC13\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s>&quot;cloud.google.com/go/firestore&quot;</span></td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L14\" class=\"blob-num js-line-number\" data-line-number=\"14\"></td>\n        <td id=\"file-firestore_limit_test-go-LC14\" class=\"blob-code blob-code-inner js-file-line\">)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L15\" class=\"blob-num js-line-number\" data-line-number=\"15\"></td>\n        <td id=\"file-firestore_limit_test-go-LC15\" class=\"blob-code blob-code-inner js-file-line\">\n</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L16\" class=\"blob-num js-line-number\" data-line-number=\"16\"></td>\n        <td id=\"file-firestore_limit_test-go-LC16\" class=\"blob-code blob-code-inner js-file-line\"><span class=pl-k>var</span> (</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L17\" class=\"blob-num js-line-number\" data-line-number=\"17\"></td>\n        <td id=\"file-firestore_limit_test-go-LC17\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>size</span>  <span class=pl-c1>=</span> <span class=pl-s1>flag</span>.<span class=pl-en>Int</span>(<span class=pl-s>&quot;size&quot;</span>, <span class=pl-c1>0</span>, <span class=pl-s>&quot;chunk size&quot;</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L18\" class=\"blob-num js-line-number\" data-line-number=\"18\"></td>\n        <td id=\"file-firestore_limit_test-go-LC18\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>total</span> <span class=pl-c1>=</span> <span class=pl-s1>flag</span>.<span class=pl-en>Int</span>(<span class=pl-s>&quot;total&quot;</span>, <span class=pl-c1>0</span>, <span class=pl-s>&quot;total count&quot;</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L19\" class=\"blob-num js-line-number\" data-line-number=\"19\"></td>\n        <td id=\"file-firestore_limit_test-go-LC19\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>multi</span> <span class=pl-c1>=</span> <span class=pl-s1>flag</span>.<span class=pl-en>Int</span>(<span class=pl-s>&quot;multi&quot;</span>, <span class=pl-c1>0</span>, <span class=pl-s>&quot;multi&quot;</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L20\" class=\"blob-num js-line-number\" data-line-number=\"20\"></td>\n        <td id=\"file-firestore_limit_test-go-LC20\" class=\"blob-code blob-code-inner js-file-line\">)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L21\" class=\"blob-num js-line-number\" data-line-number=\"21\"></td>\n        <td id=\"file-firestore_limit_test-go-LC21\" class=\"blob-code blob-code-inner js-file-line\">\n</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L22\" class=\"blob-num js-line-number\" data-line-number=\"22\"></td>\n        <td id=\"file-firestore_limit_test-go-LC22\" class=\"blob-code blob-code-inner js-file-line\"><span class=pl-k>func</span> <span class=pl-en>main</span>() {</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L23\" class=\"blob-num js-line-number\" data-line-number=\"23\"></td>\n        <td id=\"file-firestore_limit_test-go-LC23\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>flag</span>.<span class=pl-en>Parse</span>()</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L24\" class=\"blob-num js-line-number\" data-line-number=\"24\"></td>\n        <td id=\"file-firestore_limit_test-go-LC24\" class=\"blob-code blob-code-inner js-file-line\">\n</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L25\" class=\"blob-num js-line-number\" data-line-number=\"25\"></td>\n        <td id=\"file-firestore_limit_test-go-LC25\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>ctx</span> <span class=pl-c1>:=</span> <span class=pl-s1>context</span>.<span class=pl-en>Background</span>()</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L26\" class=\"blob-num js-line-number\" data-line-number=\"26\"></td>\n        <td id=\"file-firestore_limit_test-go-LC26\" class=\"blob-code blob-code-inner js-file-line\">\n</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L27\" class=\"blob-num js-line-number\" data-line-number=\"27\"></td>\n        <td id=\"file-firestore_limit_test-go-LC27\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>client</span>, <span class=pl-s1>err</span> <span class=pl-c1>:=</span> <span class=pl-s1>firestore</span>.<span class=pl-en>NewClient</span>(<span class=pl-s1>ctx</span>, <span class=pl-s1>os</span>.<span class=pl-en>Getenv</span>(<span class=pl-s>&quot;PROJECT_ID&quot;</span>))</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L28\" class=\"blob-num js-line-number\" data-line-number=\"28\"></td>\n        <td id=\"file-firestore_limit_test-go-LC28\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-k>if</span> <span class=pl-s1>err</span> <span class=pl-c1>!=</span> <span class=pl-c1>nil</span> {</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L29\" class=\"blob-num js-line-number\" data-line-number=\"29\"></td>\n        <td id=\"file-firestore_limit_test-go-LC29\" class=\"blob-code blob-code-inner js-file-line\">\t\t<span class=pl-s1>log</span>.<span class=pl-en>Fatal</span>(<span class=pl-s1>err</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L30\" class=\"blob-num js-line-number\" data-line-number=\"30\"></td>\n        <td id=\"file-firestore_limit_test-go-LC30\" class=\"blob-code blob-code-inner js-file-line\">\t}</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L31\" class=\"blob-num js-line-number\" data-line-number=\"31\"></td>\n        <td id=\"file-firestore_limit_test-go-LC31\" class=\"blob-code blob-code-inner js-file-line\">\n</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L32\" class=\"blob-num js-line-number\" data-line-number=\"32\"></td>\n        <td id=\"file-firestore_limit_test-go-LC32\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>data</span> <span class=pl-c1>:=</span> <span class=pl-en>generateDocumentData</span>(<span class=pl-s1>client</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L33\" class=\"blob-num js-line-number\" data-line-number=\"33\"></td>\n        <td id=\"file-firestore_limit_test-go-LC33\" class=\"blob-code blob-code-inner js-file-line\">\n</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L34\" class=\"blob-num js-line-number\" data-line-number=\"34\"></td>\n        <td id=\"file-firestore_limit_test-go-LC34\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>fmt</span>.<span class=pl-en>Println</span>(<span class=pl-s>&quot;create&quot;</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L35\" class=\"blob-num js-line-number\" data-line-number=\"35\"></td>\n        <td id=\"file-firestore_limit_test-go-LC35\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-en>exec</span>(<span class=pl-s1>ctx</span>, <span class=pl-s1>client</span>, <span class=pl-s1>data</span>, <span class=pl-s1>create</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L36\" class=\"blob-num js-line-number\" data-line-number=\"36\"></td>\n        <td id=\"file-firestore_limit_test-go-LC36\" class=\"blob-code blob-code-inner js-file-line\">\n</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L37\" class=\"blob-num js-line-number\" data-line-number=\"37\"></td>\n        <td id=\"file-firestore_limit_test-go-LC37\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>fmt</span>.<span class=pl-en>Println</span>(<span class=pl-s>&quot;update&quot;</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L38\" class=\"blob-num js-line-number\" data-line-number=\"38\"></td>\n        <td id=\"file-firestore_limit_test-go-LC38\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-en>exec</span>(<span class=pl-s1>ctx</span>, <span class=pl-s1>client</span>, <span class=pl-s1>data</span>, <span class=pl-s1>update</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L39\" class=\"blob-num js-line-number\" data-line-number=\"39\"></td>\n        <td id=\"file-firestore_limit_test-go-LC39\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-c>// exec(ctx, client, data, updateIncrement)</span></td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L40\" class=\"blob-num js-line-number\" data-line-number=\"40\"></td>\n        <td id=\"file-firestore_limit_test-go-LC40\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-c>// exec(ctx, client, data, updateArrayUnion)</span></td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L41\" class=\"blob-num js-line-number\" data-line-number=\"41\"></td>\n        <td id=\"file-firestore_limit_test-go-LC41\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-c>// exec(ctx, client, data, updateServerTimestamp)</span></td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L42\" class=\"blob-num js-line-number\" data-line-number=\"42\"></td>\n        <td id=\"file-firestore_limit_test-go-LC42\" class=\"blob-code blob-code-inner js-file-line\">\n</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L43\" class=\"blob-num js-line-number\" data-line-number=\"43\"></td>\n        <td id=\"file-firestore_limit_test-go-LC43\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>fmt</span>.<span class=pl-en>Println</span>(<span class=pl-s>&quot;read&quot;</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L44\" class=\"blob-num js-line-number\" data-line-number=\"44\"></td>\n        <td id=\"file-firestore_limit_test-go-LC44\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-en>read</span>(<span class=pl-s1>ctx</span>, <span class=pl-s1>client</span>.<span class=pl-en>Collection</span>(<span class=pl-s>&quot;articles&quot;</span>))</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L45\" class=\"blob-num js-line-number\" data-line-number=\"45\"></td>\n        <td id=\"file-firestore_limit_test-go-LC45\" class=\"blob-code blob-code-inner js-file-line\">\n</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L46\" class=\"blob-num js-line-number\" data-line-number=\"46\"></td>\n        <td id=\"file-firestore_limit_test-go-LC46\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-c>// fmt.Println(&quot;delete&quot;)</span></td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L47\" class=\"blob-num js-line-number\" data-line-number=\"47\"></td>\n        <td id=\"file-firestore_limit_test-go-LC47\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-c>// exec(ctx, client, data, delete)</span></td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L48\" class=\"blob-num js-line-number\" data-line-number=\"48\"></td>\n        <td id=\"file-firestore_limit_test-go-LC48\" class=\"blob-code blob-code-inner js-file-line\">}</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L49\" class=\"blob-num js-line-number\" data-line-number=\"49\"></td>\n        <td id=\"file-firestore_limit_test-go-LC49\" class=\"blob-code blob-code-inner js-file-line\">\n</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L50\" class=\"blob-num js-line-number\" data-line-number=\"50\"></td>\n        <td id=\"file-firestore_limit_test-go-LC50\" class=\"blob-code blob-code-inner js-file-line\"><span class=pl-k>func</span> <span class=pl-en>panicIf</span>(<span class=pl-s1>err</span> <span class=pl-smi>error</span>) {</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L51\" class=\"blob-num js-line-number\" data-line-number=\"51\"></td>\n        <td id=\"file-firestore_limit_test-go-LC51\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-k>if</span> <span class=pl-s1>err</span> <span class=pl-c1>!=</span> <span class=pl-c1>nil</span> {</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L52\" class=\"blob-num js-line-number\" data-line-number=\"52\"></td>\n        <td id=\"file-firestore_limit_test-go-LC52\" class=\"blob-code blob-code-inner js-file-line\">\t\t<span class=pl-en>panic</span>(<span class=pl-s1>err</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L53\" class=\"blob-num js-line-number\" data-line-number=\"53\"></td>\n        <td id=\"file-firestore_limit_test-go-LC53\" class=\"blob-code blob-code-inner js-file-line\">\t}</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L54\" class=\"blob-num js-line-number\" data-line-number=\"54\"></td>\n        <td id=\"file-firestore_limit_test-go-LC54\" class=\"blob-code blob-code-inner js-file-line\">}</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L55\" class=\"blob-num js-line-number\" data-line-number=\"55\"></td>\n        <td id=\"file-firestore_limit_test-go-LC55\" class=\"blob-code blob-code-inner js-file-line\">\n</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L56\" class=\"blob-num js-line-number\" data-line-number=\"56\"></td>\n        <td id=\"file-firestore_limit_test-go-LC56\" class=\"blob-code blob-code-inner js-file-line\"><span class=pl-k>func</span> <span class=pl-en>generateDocumentData</span>(<span class=pl-s1>client</span> <span class=pl-c1>*</span>firestore.<span class=pl-smi>Client</span>) []<span class=pl-k>map</span>[<span class=pl-c1>*</span>firestore.<span class=pl-smi>DocumentRef</span>]<span class=pl-k>map</span>[<span class=pl-smi>string</span>]<span class=pl-k>interface</span>{} {</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L57\" class=\"blob-num js-line-number\" data-line-number=\"57\"></td>\n        <td id=\"file-firestore_limit_test-go-LC57\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>limit</span> <span class=pl-c1>:=</span> <span class=pl-c1>*</span><span class=pl-s1>size</span></td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L58\" class=\"blob-num js-line-number\" data-line-number=\"58\"></td>\n        <td id=\"file-firestore_limit_test-go-LC58\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>totalCount</span> <span class=pl-c1>:=</span> <span class=pl-c1>*</span><span class=pl-s1>total</span></td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L59\" class=\"blob-num js-line-number\" data-line-number=\"59\"></td>\n        <td id=\"file-firestore_limit_test-go-LC59\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>count</span> <span class=pl-c1>:=</span> <span class=pl-s1>totalCount</span><span class=pl-c1>/</span><span class=pl-s1>limit</span> <span class=pl-c1>+</span> <span class=pl-c1>1</span></td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L60\" class=\"blob-num js-line-number\" data-line-number=\"60\"></td>\n        <td id=\"file-firestore_limit_test-go-LC60\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>data</span> <span class=pl-c1>:=</span> <span class=pl-en>make</span>([]<span class=pl-k>map</span>[<span class=pl-c1>*</span>firestore.<span class=pl-smi>DocumentRef</span>]<span class=pl-k>map</span>[<span class=pl-smi>string</span>]<span class=pl-k>interface</span>{}, <span class=pl-c1>0</span>, <span class=pl-s1>count</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L61\" class=\"blob-num js-line-number\" data-line-number=\"61\"></td>\n        <td id=\"file-firestore_limit_test-go-LC61\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>col</span> <span class=pl-c1>:=</span> <span class=pl-s1>client</span>.<span class=pl-en>Collection</span>(<span class=pl-s>&quot;articles&quot;</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L62\" class=\"blob-num js-line-number\" data-line-number=\"62\"></td>\n        <td id=\"file-firestore_limit_test-go-LC62\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-k>for</span> <span class=pl-s1>j</span> <span class=pl-c1>:=</span> <span class=pl-c1>0</span>; <span class=pl-s1>j</span> <span class=pl-c1>&lt;</span> <span class=pl-s1>count</span>; <span class=pl-s1>j</span><span class=pl-c1>++</span> {</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L63\" class=\"blob-num js-line-number\" data-line-number=\"63\"></td>\n        <td id=\"file-firestore_limit_test-go-LC63\" class=\"blob-code blob-code-inner js-file-line\">\t\t<span class=pl-s1>min</span> <span class=pl-c1>:=</span> <span class=pl-s1>limit</span> <span class=pl-c1>*</span> <span class=pl-s1>j</span></td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L64\" class=\"blob-num js-line-number\" data-line-number=\"64\"></td>\n        <td id=\"file-firestore_limit_test-go-LC64\" class=\"blob-code blob-code-inner js-file-line\">\t\t<span class=pl-s1>max</span> <span class=pl-c1>:=</span> <span class=pl-s1>limit</span> <span class=pl-c1>*</span> (<span class=pl-s1>j</span> <span class=pl-c1>+</span> <span class=pl-c1>1</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L65\" class=\"blob-num js-line-number\" data-line-number=\"65\"></td>\n        <td id=\"file-firestore_limit_test-go-LC65\" class=\"blob-code blob-code-inner js-file-line\">\t\t<span class=pl-k>if</span> <span class=pl-s1>max</span> <span class=pl-c1>&gt;</span> <span class=pl-s1>totalCount</span> {</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L66\" class=\"blob-num js-line-number\" data-line-number=\"66\"></td>\n        <td id=\"file-firestore_limit_test-go-LC66\" class=\"blob-code blob-code-inner js-file-line\">\t\t\t<span class=pl-s1>max</span> <span class=pl-c1>=</span> <span class=pl-s1>totalCount</span></td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L67\" class=\"blob-num js-line-number\" data-line-number=\"67\"></td>\n        <td id=\"file-firestore_limit_test-go-LC67\" class=\"blob-code blob-code-inner js-file-line\">\t\t}</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L68\" class=\"blob-num js-line-number\" data-line-number=\"68\"></td>\n        <td id=\"file-firestore_limit_test-go-LC68\" class=\"blob-code blob-code-inner js-file-line\">\t\t<span class=pl-k>if</span> <span class=pl-s1>min</span> <span class=pl-c1>==</span> <span class=pl-s1>max</span> {</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L69\" class=\"blob-num js-line-number\" data-line-number=\"69\"></td>\n        <td id=\"file-firestore_limit_test-go-LC69\" class=\"blob-code blob-code-inner js-file-line\">\t\t\t<span class=pl-k>break</span></td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L70\" class=\"blob-num js-line-number\" data-line-number=\"70\"></td>\n        <td id=\"file-firestore_limit_test-go-LC70\" class=\"blob-code blob-code-inner js-file-line\">\t\t}</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L71\" class=\"blob-num js-line-number\" data-line-number=\"71\"></td>\n        <td id=\"file-firestore_limit_test-go-LC71\" class=\"blob-code blob-code-inner js-file-line\">\t\t<span class=pl-s1>results</span> <span class=pl-c1>:=</span> <span class=pl-en>make</span>(<span class=pl-k>map</span>[<span class=pl-c1>*</span>firestore.<span class=pl-smi>DocumentRef</span>]<span class=pl-k>map</span>[<span class=pl-smi>string</span>]<span class=pl-k>interface</span>{}, <span class=pl-s1>limit</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L72\" class=\"blob-num js-line-number\" data-line-number=\"72\"></td>\n        <td id=\"file-firestore_limit_test-go-LC72\" class=\"blob-code blob-code-inner js-file-line\">\t\t<span class=pl-k>for</span> <span class=pl-s1>i</span> <span class=pl-c1>:=</span> <span class=pl-s1>min</span>; <span class=pl-s1>i</span> <span class=pl-c1>&lt;</span> <span class=pl-s1>max</span>; <span class=pl-s1>i</span><span class=pl-c1>++</span> {</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L73\" class=\"blob-num js-line-number\" data-line-number=\"73\"></td>\n        <td id=\"file-firestore_limit_test-go-LC73\" class=\"blob-code blob-code-inner js-file-line\">\t\t\t<span class=pl-s1>doc</span> <span class=pl-c1>:=</span> <span class=pl-s1>col</span>.<span class=pl-en>NewDoc</span>()</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L74\" class=\"blob-num js-line-number\" data-line-number=\"74\"></td>\n        <td id=\"file-firestore_limit_test-go-LC74\" class=\"blob-code blob-code-inner js-file-line\">\t\t\t<span class=pl-s1>results</span>[<span class=pl-s1>doc</span>] <span class=pl-c1>=</span> <span class=pl-k>map</span>[<span class=pl-smi>string</span>]<span class=pl-k>interface</span>{}{</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L75\" class=\"blob-num js-line-number\" data-line-number=\"75\"></td>\n        <td id=\"file-firestore_limit_test-go-LC75\" class=\"blob-code blob-code-inner js-file-line\">\t\t\t\t<span class=pl-s>&quot;title&quot;</span>:        <span class=pl-s>&quot;title_&quot;</span> <span class=pl-c1>+</span> <span class=pl-s1>strconv</span>.<span class=pl-en>FormatInt</span>(<span class=pl-en>int64</span>(<span class=pl-s1>i</span>), <span class=pl-c1>10</span>),</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L76\" class=\"blob-num js-line-number\" data-line-number=\"76\"></td>\n        <td id=\"file-firestore_limit_test-go-LC76\" class=\"blob-code blob-code-inner js-file-line\">\t\t\t\t<span class=pl-s>&quot;tags&quot;</span>:         []<span class=pl-smi>string</span>{<span class=pl-s>&quot;tag_1&quot;</span>, <span class=pl-s>&quot;tag_2&quot;</span>, <span class=pl-s>&quot;tag_3&quot;</span>},</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L77\" class=\"blob-num js-line-number\" data-line-number=\"77\"></td>\n        <td id=\"file-firestore_limit_test-go-LC77\" class=\"blob-code blob-code-inner js-file-line\">\t\t\t\t<span class=pl-s>&quot;author_id&quot;</span>:    <span class=pl-s>&quot;author_id_&quot;</span> <span class=pl-c1>+</span> <span class=pl-s1>strconv</span>.<span class=pl-en>FormatInt</span>(<span class=pl-en>int64</span>(<span class=pl-s1>i</span>), <span class=pl-c1>10</span>),</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L78\" class=\"blob-num js-line-number\" data-line-number=\"78\"></td>\n        <td id=\"file-firestore_limit_test-go-LC78\" class=\"blob-code blob-code-inner js-file-line\">\t\t\t\t<span class=pl-s>&quot;view_count&quot;</span>:   <span class=pl-s1>i</span>,</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L79\" class=\"blob-num js-line-number\" data-line-number=\"79\"></td>\n        <td id=\"file-firestore_limit_test-go-LC79\" class=\"blob-code blob-code-inner js-file-line\">\t\t\t\t<span class=pl-s>&quot;is_published&quot;</span>: <span class=pl-c1>true</span>,</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L80\" class=\"blob-num js-line-number\" data-line-number=\"80\"></td>\n        <td id=\"file-firestore_limit_test-go-LC80\" class=\"blob-code blob-code-inner js-file-line\">\t\t\t\t<span class=pl-s>&quot;text&quot;</span>:         <span class=pl-s>&quot;0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789&quot;</span>,</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L81\" class=\"blob-num js-line-number\" data-line-number=\"81\"></td>\n        <td id=\"file-firestore_limit_test-go-LC81\" class=\"blob-code blob-code-inner js-file-line\">\t\t\t\t<span class=pl-c>// &quot;update_timestamp&quot;: firestore.ServerTimestamp,</span></td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L82\" class=\"blob-num js-line-number\" data-line-number=\"82\"></td>\n        <td id=\"file-firestore_limit_test-go-LC82\" class=\"blob-code blob-code-inner js-file-line\">\t\t\t}</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L83\" class=\"blob-num js-line-number\" data-line-number=\"83\"></td>\n        <td id=\"file-firestore_limit_test-go-LC83\" class=\"blob-code blob-code-inner js-file-line\">\t\t}</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L84\" class=\"blob-num js-line-number\" data-line-number=\"84\"></td>\n        <td id=\"file-firestore_limit_test-go-LC84\" class=\"blob-code blob-code-inner js-file-line\">\t\t<span class=pl-s1>data</span> <span class=pl-c1>=</span> <span class=pl-en>append</span>(<span class=pl-s1>data</span>, <span class=pl-s1>results</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L85\" class=\"blob-num js-line-number\" data-line-number=\"85\"></td>\n        <td id=\"file-firestore_limit_test-go-LC85\" class=\"blob-code blob-code-inner js-file-line\">\t}</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L86\" class=\"blob-num js-line-number\" data-line-number=\"86\"></td>\n        <td id=\"file-firestore_limit_test-go-LC86\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-k>return</span> <span class=pl-s1>data</span></td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L87\" class=\"blob-num js-line-number\" data-line-number=\"87\"></td>\n        <td id=\"file-firestore_limit_test-go-LC87\" class=\"blob-code blob-code-inner js-file-line\">}</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L88\" class=\"blob-num js-line-number\" data-line-number=\"88\"></td>\n        <td id=\"file-firestore_limit_test-go-LC88\" class=\"blob-code blob-code-inner js-file-line\">\n</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L89\" class=\"blob-num js-line-number\" data-line-number=\"89\"></td>\n        <td id=\"file-firestore_limit_test-go-LC89\" class=\"blob-code blob-code-inner js-file-line\"><span class=pl-k>func</span> <span class=pl-en>exec</span>(<span class=pl-s1>ctx</span> context.<span class=pl-smi>Context</span>, <span class=pl-s1>client</span> <span class=pl-c1>*</span>firestore.<span class=pl-smi>Client</span>, <span class=pl-s1>data</span> []<span class=pl-k>map</span>[<span class=pl-c1>*</span>firestore.<span class=pl-smi>DocumentRef</span>]<span class=pl-k>map</span>[<span class=pl-smi>string</span>]<span class=pl-k>interface</span>{},</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L90\" class=\"blob-num js-line-number\" data-line-number=\"90\"></td>\n        <td id=\"file-firestore_limit_test-go-LC90\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>execFunc</span> <span class=pl-k>func</span>(<span class=pl-s1>ctx</span> context.<span class=pl-smi>Context</span>, <span class=pl-s1>client</span> <span class=pl-c1>*</span>firestore.<span class=pl-smi>Client</span>, <span class=pl-s1>col</span> <span class=pl-c1>*</span>firestore.<span class=pl-smi>CollectionRef</span>, <span class=pl-s1>articles</span> <span class=pl-k>map</span>[<span class=pl-c1>*</span>firestore.<span class=pl-smi>DocumentRef</span>]<span class=pl-k>map</span>[<span class=pl-smi>string</span>]<span class=pl-k>interface</span>{})) {</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L91\" class=\"blob-num js-line-number\" data-line-number=\"91\"></td>\n        <td id=\"file-firestore_limit_test-go-LC91\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>col</span> <span class=pl-c1>:=</span> <span class=pl-s1>client</span>.<span class=pl-en>Collection</span>(<span class=pl-s>&quot;articles&quot;</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L92\" class=\"blob-num js-line-number\" data-line-number=\"92\"></td>\n        <td id=\"file-firestore_limit_test-go-LC92\" class=\"blob-code blob-code-inner js-file-line\">\n</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L93\" class=\"blob-num js-line-number\" data-line-number=\"93\"></td>\n        <td id=\"file-firestore_limit_test-go-LC93\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>fmt</span>.<span class=pl-en>Println</span>(<span class=pl-s>&quot;start&quot;</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L94\" class=\"blob-num js-line-number\" data-line-number=\"94\"></td>\n        <td id=\"file-firestore_limit_test-go-LC94\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>start</span> <span class=pl-c1>:=</span> <span class=pl-s1>time</span>.<span class=pl-en>Now</span>()</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L95\" class=\"blob-num js-line-number\" data-line-number=\"95\"></td>\n        <td id=\"file-firestore_limit_test-go-LC95\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>multi</span> <span class=pl-c1>:=</span> <span class=pl-c1>*</span><span class=pl-s1>multi</span></td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L96\" class=\"blob-num js-line-number\" data-line-number=\"96\"></td>\n        <td id=\"file-firestore_limit_test-go-LC96\" class=\"blob-code blob-code-inner js-file-line\">\n</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L97\" class=\"blob-num js-line-number\" data-line-number=\"97\"></td>\n        <td id=\"file-firestore_limit_test-go-LC97\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>dataLen</span> <span class=pl-c1>:=</span> <span class=pl-en>len</span>(<span class=pl-s1>data</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L98\" class=\"blob-num js-line-number\" data-line-number=\"98\"></td>\n        <td id=\"file-firestore_limit_test-go-LC98\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>current</span> <span class=pl-c1>:=</span> <span class=pl-c1>0</span></td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L99\" class=\"blob-num js-line-number\" data-line-number=\"99\"></td>\n        <td id=\"file-firestore_limit_test-go-LC99\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-k>for</span> {</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L100\" class=\"blob-num js-line-number\" data-line-number=\"100\"></td>\n        <td id=\"file-firestore_limit_test-go-LC100\" class=\"blob-code blob-code-inner js-file-line\">\t\t<span class=pl-s1>wg</span> <span class=pl-c1>:=</span> <span class=pl-c1>&amp;</span>sync.<span class=pl-smi>WaitGroup</span>{}</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L101\" class=\"blob-num js-line-number\" data-line-number=\"101\"></td>\n        <td id=\"file-firestore_limit_test-go-LC101\" class=\"blob-code blob-code-inner js-file-line\">\t\t<span class=pl-k>for</span> <span class=pl-s1>i</span> <span class=pl-c1>:=</span> <span class=pl-c1>0</span>; <span class=pl-s1>i</span> <span class=pl-c1>&lt;</span> <span class=pl-s1>multi</span>; <span class=pl-s1>i</span><span class=pl-c1>++</span> {</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L102\" class=\"blob-num js-line-number\" data-line-number=\"102\"></td>\n        <td id=\"file-firestore_limit_test-go-LC102\" class=\"blob-code blob-code-inner js-file-line\">\t\t\t<span class=pl-s1>articles</span> <span class=pl-c1>:=</span> <span class=pl-s1>data</span>[<span class=pl-s1>current</span>]</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L103\" class=\"blob-num js-line-number\" data-line-number=\"103\"></td>\n        <td id=\"file-firestore_limit_test-go-LC103\" class=\"blob-code blob-code-inner js-file-line\">\n</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L104\" class=\"blob-num js-line-number\" data-line-number=\"104\"></td>\n        <td id=\"file-firestore_limit_test-go-LC104\" class=\"blob-code blob-code-inner js-file-line\">\t\t\t<span class=pl-s1>wg</span>.<span class=pl-en>Add</span>(<span class=pl-c1>1</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L105\" class=\"blob-num js-line-number\" data-line-number=\"105\"></td>\n        <td id=\"file-firestore_limit_test-go-LC105\" class=\"blob-code blob-code-inner js-file-line\">\t\t\t<span class=pl-k>go</span> <span class=pl-k>func</span>() {</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L106\" class=\"blob-num js-line-number\" data-line-number=\"106\"></td>\n        <td id=\"file-firestore_limit_test-go-LC106\" class=\"blob-code blob-code-inner js-file-line\">\t\t\t\t<span class=pl-en>execFunc</span>(<span class=pl-s1>ctx</span>, <span class=pl-s1>client</span>, <span class=pl-s1>col</span>, <span class=pl-s1>articles</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L107\" class=\"blob-num js-line-number\" data-line-number=\"107\"></td>\n        <td id=\"file-firestore_limit_test-go-LC107\" class=\"blob-code blob-code-inner js-file-line\">\t\t\t\t<span class=pl-s1>wg</span>.<span class=pl-en>Done</span>()</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L108\" class=\"blob-num js-line-number\" data-line-number=\"108\"></td>\n        <td id=\"file-firestore_limit_test-go-LC108\" class=\"blob-code blob-code-inner js-file-line\">\t\t\t}()</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L109\" class=\"blob-num js-line-number\" data-line-number=\"109\"></td>\n        <td id=\"file-firestore_limit_test-go-LC109\" class=\"blob-code blob-code-inner js-file-line\">\t\t\t<span class=pl-s1>current</span><span class=pl-c1>++</span></td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L110\" class=\"blob-num js-line-number\" data-line-number=\"110\"></td>\n        <td id=\"file-firestore_limit_test-go-LC110\" class=\"blob-code blob-code-inner js-file-line\">\t\t\t<span class=pl-k>if</span> <span class=pl-s1>dataLen</span> <span class=pl-c1>==</span> <span class=pl-s1>current</span> {</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L111\" class=\"blob-num js-line-number\" data-line-number=\"111\"></td>\n        <td id=\"file-firestore_limit_test-go-LC111\" class=\"blob-code blob-code-inner js-file-line\">\t\t\t\t<span class=pl-k>break</span></td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L112\" class=\"blob-num js-line-number\" data-line-number=\"112\"></td>\n        <td id=\"file-firestore_limit_test-go-LC112\" class=\"blob-code blob-code-inner js-file-line\">\t\t\t}</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L113\" class=\"blob-num js-line-number\" data-line-number=\"113\"></td>\n        <td id=\"file-firestore_limit_test-go-LC113\" class=\"blob-code blob-code-inner js-file-line\">\t\t}</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L114\" class=\"blob-num js-line-number\" data-line-number=\"114\"></td>\n        <td id=\"file-firestore_limit_test-go-LC114\" class=\"blob-code blob-code-inner js-file-line\">\t\t<span class=pl-s1>wg</span>.<span class=pl-en>Wait</span>()</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L115\" class=\"blob-num js-line-number\" data-line-number=\"115\"></td>\n        <td id=\"file-firestore_limit_test-go-LC115\" class=\"blob-code blob-code-inner js-file-line\">\t\t<span class=pl-k>if</span> <span class=pl-s1>dataLen</span> <span class=pl-c1>==</span> <span class=pl-s1>current</span> {</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L116\" class=\"blob-num js-line-number\" data-line-number=\"116\"></td>\n        <td id=\"file-firestore_limit_test-go-LC116\" class=\"blob-code blob-code-inner js-file-line\">\t\t\t<span class=pl-k>break</span></td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L117\" class=\"blob-num js-line-number\" data-line-number=\"117\"></td>\n        <td id=\"file-firestore_limit_test-go-LC117\" class=\"blob-code blob-code-inner js-file-line\">\t\t}</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L118\" class=\"blob-num js-line-number\" data-line-number=\"118\"></td>\n        <td id=\"file-firestore_limit_test-go-LC118\" class=\"blob-code blob-code-inner js-file-line\">\t\t<span class=pl-s1>multi</span> <span class=pl-c1>*=</span> <span class=pl-c1>2</span></td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L119\" class=\"blob-num js-line-number\" data-line-number=\"119\"></td>\n        <td id=\"file-firestore_limit_test-go-LC119\" class=\"blob-code blob-code-inner js-file-line\">\t}</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L120\" class=\"blob-num js-line-number\" data-line-number=\"120\"></td>\n        <td id=\"file-firestore_limit_test-go-LC120\" class=\"blob-code blob-code-inner js-file-line\">\n</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L121\" class=\"blob-num js-line-number\" data-line-number=\"121\"></td>\n        <td id=\"file-firestore_limit_test-go-LC121\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>fmt</span>.<span class=pl-en>Println</span>(<span class=pl-s1>time</span>.<span class=pl-en>Now</span>().<span class=pl-en>Sub</span>(<span class=pl-s1>start</span>))</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L122\" class=\"blob-num js-line-number\" data-line-number=\"122\"></td>\n        <td id=\"file-firestore_limit_test-go-LC122\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>fmt</span>.<span class=pl-en>Println</span>(<span class=pl-s>&quot;end&quot;</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L123\" class=\"blob-num js-line-number\" data-line-number=\"123\"></td>\n        <td id=\"file-firestore_limit_test-go-LC123\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>last</span>, <span class=pl-s1>err</span> <span class=pl-c1>:=</span> <span class=pl-s1>col</span>.<span class=pl-en>OrderBy</span>(<span class=pl-s>&quot;view_count&quot;</span>, <span class=pl-s1>firestore</span>.<span class=pl-c1>Desc</span>).<span class=pl-en>Limit</span>(<span class=pl-c1>1</span>).<span class=pl-en>Documents</span>(<span class=pl-s1>ctx</span>).<span class=pl-en>GetAll</span>()</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L124\" class=\"blob-num js-line-number\" data-line-number=\"124\"></td>\n        <td id=\"file-firestore_limit_test-go-LC124\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-en>panicIf</span>(<span class=pl-s1>err</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L125\" class=\"blob-num js-line-number\" data-line-number=\"125\"></td>\n        <td id=\"file-firestore_limit_test-go-LC125\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-k>if</span> <span class=pl-en>len</span>(<span class=pl-s1>last</span>) <span class=pl-c1>&gt;</span> <span class=pl-c1>0</span> {</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L126\" class=\"blob-num js-line-number\" data-line-number=\"126\"></td>\n        <td id=\"file-firestore_limit_test-go-LC126\" class=\"blob-code blob-code-inner js-file-line\">\t\t<span class=pl-s1>fmt</span>.<span class=pl-en>Println</span>(<span class=pl-s1>last</span>[<span class=pl-c1>0</span>].<span class=pl-en>Data</span>()[<span class=pl-s>&quot;view_count&quot;</span>])</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L127\" class=\"blob-num js-line-number\" data-line-number=\"127\"></td>\n        <td id=\"file-firestore_limit_test-go-LC127\" class=\"blob-code blob-code-inner js-file-line\">\t}</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L128\" class=\"blob-num js-line-number\" data-line-number=\"128\"></td>\n        <td id=\"file-firestore_limit_test-go-LC128\" class=\"blob-code blob-code-inner js-file-line\">}</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L129\" class=\"blob-num js-line-number\" data-line-number=\"129\"></td>\n        <td id=\"file-firestore_limit_test-go-LC129\" class=\"blob-code blob-code-inner js-file-line\">\n</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L130\" class=\"blob-num js-line-number\" data-line-number=\"130\"></td>\n        <td id=\"file-firestore_limit_test-go-LC130\" class=\"blob-code blob-code-inner js-file-line\"><span class=pl-k>func</span> <span class=pl-en>create</span>(<span class=pl-s1>ctx</span> context.<span class=pl-smi>Context</span>, <span class=pl-s1>client</span> <span class=pl-c1>*</span>firestore.<span class=pl-smi>Client</span>, <span class=pl-s1>col</span> <span class=pl-c1>*</span>firestore.<span class=pl-smi>CollectionRef</span>, <span class=pl-s1>articles</span> <span class=pl-k>map</span>[<span class=pl-c1>*</span>firestore.<span class=pl-smi>DocumentRef</span>]<span class=pl-k>map</span>[<span class=pl-smi>string</span>]<span class=pl-k>interface</span>{}) {</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L131\" class=\"blob-num js-line-number\" data-line-number=\"131\"></td>\n        <td id=\"file-firestore_limit_test-go-LC131\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>batch</span> <span class=pl-c1>:=</span> <span class=pl-s1>client</span>.<span class=pl-en>Batch</span>()</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L132\" class=\"blob-num js-line-number\" data-line-number=\"132\"></td>\n        <td id=\"file-firestore_limit_test-go-LC132\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-k>for</span> <span class=pl-s1>doc</span>, <span class=pl-s1>article</span> <span class=pl-c1>:=</span> <span class=pl-k>range</span> <span class=pl-s1>articles</span> {</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L133\" class=\"blob-num js-line-number\" data-line-number=\"133\"></td>\n        <td id=\"file-firestore_limit_test-go-LC133\" class=\"blob-code blob-code-inner js-file-line\">\t\t<span class=pl-s1>batch</span>.<span class=pl-en>Create</span>(<span class=pl-s1>doc</span>, <span class=pl-s1>article</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L134\" class=\"blob-num js-line-number\" data-line-number=\"134\"></td>\n        <td id=\"file-firestore_limit_test-go-LC134\" class=\"blob-code blob-code-inner js-file-line\">\t}</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L135\" class=\"blob-num js-line-number\" data-line-number=\"135\"></td>\n        <td id=\"file-firestore_limit_test-go-LC135\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>_</span>, <span class=pl-s1>err</span> <span class=pl-c1>:=</span> <span class=pl-s1>batch</span>.<span class=pl-en>Commit</span>(<span class=pl-s1>ctx</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L136\" class=\"blob-num js-line-number\" data-line-number=\"136\"></td>\n        <td id=\"file-firestore_limit_test-go-LC136\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-en>panicIf</span>(<span class=pl-s1>err</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L137\" class=\"blob-num js-line-number\" data-line-number=\"137\"></td>\n        <td id=\"file-firestore_limit_test-go-LC137\" class=\"blob-code blob-code-inner js-file-line\">}</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L138\" class=\"blob-num js-line-number\" data-line-number=\"138\"></td>\n        <td id=\"file-firestore_limit_test-go-LC138\" class=\"blob-code blob-code-inner js-file-line\">\n</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L139\" class=\"blob-num js-line-number\" data-line-number=\"139\"></td>\n        <td id=\"file-firestore_limit_test-go-LC139\" class=\"blob-code blob-code-inner js-file-line\"><span class=pl-k>func</span> <span class=pl-en>update</span>(<span class=pl-s1>ctx</span> context.<span class=pl-smi>Context</span>, <span class=pl-s1>client</span> <span class=pl-c1>*</span>firestore.<span class=pl-smi>Client</span>, <span class=pl-s1>col</span> <span class=pl-c1>*</span>firestore.<span class=pl-smi>CollectionRef</span>, <span class=pl-s1>articles</span> <span class=pl-k>map</span>[<span class=pl-c1>*</span>firestore.<span class=pl-smi>DocumentRef</span>]<span class=pl-k>map</span>[<span class=pl-smi>string</span>]<span class=pl-k>interface</span>{}) {</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L140\" class=\"blob-num js-line-number\" data-line-number=\"140\"></td>\n        <td id=\"file-firestore_limit_test-go-LC140\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>batch</span> <span class=pl-c1>:=</span> <span class=pl-s1>client</span>.<span class=pl-en>Batch</span>()</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L141\" class=\"blob-num js-line-number\" data-line-number=\"141\"></td>\n        <td id=\"file-firestore_limit_test-go-LC141\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-k>for</span> <span class=pl-s1>col</span>, <span class=pl-s1>article</span> <span class=pl-c1>:=</span> <span class=pl-k>range</span> <span class=pl-s1>articles</span> {</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L142\" class=\"blob-num js-line-number\" data-line-number=\"142\"></td>\n        <td id=\"file-firestore_limit_test-go-LC142\" class=\"blob-code blob-code-inner js-file-line\">\t\t<span class=pl-s1>batch</span>.<span class=pl-en>Update</span>(<span class=pl-s1>col</span>, []firestore.<span class=pl-smi>Update</span>{</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L143\" class=\"blob-num js-line-number\" data-line-number=\"143\"></td>\n        <td id=\"file-firestore_limit_test-go-LC143\" class=\"blob-code blob-code-inner js-file-line\">\t\t\t{<span class=pl-c1>Path</span>: <span class=pl-s>&quot;title&quot;</span>, <span class=pl-c1>Value</span>: <span class=pl-s1>article</span>[<span class=pl-s>&quot;title&quot;</span>].(<span class=pl-smi>string</span>) <span class=pl-c1>+</span> <span class=pl-s>&quot;_update&quot;</span>},</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L144\" class=\"blob-num js-line-number\" data-line-number=\"144\"></td>\n        <td id=\"file-firestore_limit_test-go-LC144\" class=\"blob-code blob-code-inner js-file-line\">\t\t\t{<span class=pl-c1>Path</span>: <span class=pl-s>&quot;view_count&quot;</span>, <span class=pl-c1>Value</span>: <span class=pl-s1>article</span>[<span class=pl-s>&quot;view_count&quot;</span>].(<span class=pl-smi>int</span>) <span class=pl-c1>+</span> <span class=pl-c1>10000</span>},</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L145\" class=\"blob-num js-line-number\" data-line-number=\"145\"></td>\n        <td id=\"file-firestore_limit_test-go-LC145\" class=\"blob-code blob-code-inner js-file-line\">\t\t})</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L146\" class=\"blob-num js-line-number\" data-line-number=\"146\"></td>\n        <td id=\"file-firestore_limit_test-go-LC146\" class=\"blob-code blob-code-inner js-file-line\">\t}</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L147\" class=\"blob-num js-line-number\" data-line-number=\"147\"></td>\n        <td id=\"file-firestore_limit_test-go-LC147\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>_</span>, <span class=pl-s1>err</span> <span class=pl-c1>:=</span> <span class=pl-s1>batch</span>.<span class=pl-en>Commit</span>(<span class=pl-s1>ctx</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L148\" class=\"blob-num js-line-number\" data-line-number=\"148\"></td>\n        <td id=\"file-firestore_limit_test-go-LC148\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-en>panicIf</span>(<span class=pl-s1>err</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L149\" class=\"blob-num js-line-number\" data-line-number=\"149\"></td>\n        <td id=\"file-firestore_limit_test-go-LC149\" class=\"blob-code blob-code-inner js-file-line\">}</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L150\" class=\"blob-num js-line-number\" data-line-number=\"150\"></td>\n        <td id=\"file-firestore_limit_test-go-LC150\" class=\"blob-code blob-code-inner js-file-line\">\n</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L151\" class=\"blob-num js-line-number\" data-line-number=\"151\"></td>\n        <td id=\"file-firestore_limit_test-go-LC151\" class=\"blob-code blob-code-inner js-file-line\"><span class=pl-k>func</span> <span class=pl-en>updateIncrement</span>(<span class=pl-s1>ctx</span> context.<span class=pl-smi>Context</span>, <span class=pl-s1>client</span> <span class=pl-c1>*</span>firestore.<span class=pl-smi>Client</span>, <span class=pl-s1>col</span> <span class=pl-c1>*</span>firestore.<span class=pl-smi>CollectionRef</span>, <span class=pl-s1>articles</span> <span class=pl-k>map</span>[<span class=pl-c1>*</span>firestore.<span class=pl-smi>DocumentRef</span>]<span class=pl-k>map</span>[<span class=pl-smi>string</span>]<span class=pl-k>interface</span>{}) {</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L152\" class=\"blob-num js-line-number\" data-line-number=\"152\"></td>\n        <td id=\"file-firestore_limit_test-go-LC152\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>batch</span> <span class=pl-c1>:=</span> <span class=pl-s1>client</span>.<span class=pl-en>Batch</span>()</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L153\" class=\"blob-num js-line-number\" data-line-number=\"153\"></td>\n        <td id=\"file-firestore_limit_test-go-LC153\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-k>for</span> <span class=pl-s1>col</span> <span class=pl-c1>:=</span> <span class=pl-k>range</span> <span class=pl-s1>articles</span> {</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L154\" class=\"blob-num js-line-number\" data-line-number=\"154\"></td>\n        <td id=\"file-firestore_limit_test-go-LC154\" class=\"blob-code blob-code-inner js-file-line\">\t\t<span class=pl-s1>batch</span>.<span class=pl-en>Update</span>(<span class=pl-s1>col</span>, []firestore.<span class=pl-smi>Update</span>{</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L155\" class=\"blob-num js-line-number\" data-line-number=\"155\"></td>\n        <td id=\"file-firestore_limit_test-go-LC155\" class=\"blob-code blob-code-inner js-file-line\">\t\t\t{<span class=pl-c1>Path</span>: <span class=pl-s>&quot;view_count&quot;</span>, <span class=pl-c1>Value</span>: <span class=pl-s1>firestore</span>.<span class=pl-en>Increment</span>(<span class=pl-c1>10000</span>)},</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L156\" class=\"blob-num js-line-number\" data-line-number=\"156\"></td>\n        <td id=\"file-firestore_limit_test-go-LC156\" class=\"blob-code blob-code-inner js-file-line\">\t\t})</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L157\" class=\"blob-num js-line-number\" data-line-number=\"157\"></td>\n        <td id=\"file-firestore_limit_test-go-LC157\" class=\"blob-code blob-code-inner js-file-line\">\t}</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L158\" class=\"blob-num js-line-number\" data-line-number=\"158\"></td>\n        <td id=\"file-firestore_limit_test-go-LC158\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>_</span>, <span class=pl-s1>err</span> <span class=pl-c1>:=</span> <span class=pl-s1>batch</span>.<span class=pl-en>Commit</span>(<span class=pl-s1>ctx</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L159\" class=\"blob-num js-line-number\" data-line-number=\"159\"></td>\n        <td id=\"file-firestore_limit_test-go-LC159\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-en>panicIf</span>(<span class=pl-s1>err</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L160\" class=\"blob-num js-line-number\" data-line-number=\"160\"></td>\n        <td id=\"file-firestore_limit_test-go-LC160\" class=\"blob-code blob-code-inner js-file-line\">}</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L161\" class=\"blob-num js-line-number\" data-line-number=\"161\"></td>\n        <td id=\"file-firestore_limit_test-go-LC161\" class=\"blob-code blob-code-inner js-file-line\">\n</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L162\" class=\"blob-num js-line-number\" data-line-number=\"162\"></td>\n        <td id=\"file-firestore_limit_test-go-LC162\" class=\"blob-code blob-code-inner js-file-line\"><span class=pl-k>func</span> <span class=pl-en>updateArrayUnion</span>(<span class=pl-s1>ctx</span> context.<span class=pl-smi>Context</span>, <span class=pl-s1>client</span> <span class=pl-c1>*</span>firestore.<span class=pl-smi>Client</span>, <span class=pl-s1>col</span> <span class=pl-c1>*</span>firestore.<span class=pl-smi>CollectionRef</span>, <span class=pl-s1>articles</span> <span class=pl-k>map</span>[<span class=pl-c1>*</span>firestore.<span class=pl-smi>DocumentRef</span>]<span class=pl-k>map</span>[<span class=pl-smi>string</span>]<span class=pl-k>interface</span>{}) {</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L163\" class=\"blob-num js-line-number\" data-line-number=\"163\"></td>\n        <td id=\"file-firestore_limit_test-go-LC163\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>batch</span> <span class=pl-c1>:=</span> <span class=pl-s1>client</span>.<span class=pl-en>Batch</span>()</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L164\" class=\"blob-num js-line-number\" data-line-number=\"164\"></td>\n        <td id=\"file-firestore_limit_test-go-LC164\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-k>for</span> <span class=pl-s1>col</span> <span class=pl-c1>:=</span> <span class=pl-k>range</span> <span class=pl-s1>articles</span> {</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L165\" class=\"blob-num js-line-number\" data-line-number=\"165\"></td>\n        <td id=\"file-firestore_limit_test-go-LC165\" class=\"blob-code blob-code-inner js-file-line\">\t\t<span class=pl-s1>batch</span>.<span class=pl-en>Update</span>(<span class=pl-s1>col</span>, []firestore.<span class=pl-smi>Update</span>{</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L166\" class=\"blob-num js-line-number\" data-line-number=\"166\"></td>\n        <td id=\"file-firestore_limit_test-go-LC166\" class=\"blob-code blob-code-inner js-file-line\">\t\t\t{<span class=pl-c1>Path</span>: <span class=pl-s>&quot;tags&quot;</span>, <span class=pl-c1>Value</span>: <span class=pl-s1>firestore</span>.<span class=pl-en>ArrayUnion</span>(<span class=pl-s>&quot;tag_3&quot;</span>, <span class=pl-s>&quot;tag_4&quot;</span>)},</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L167\" class=\"blob-num js-line-number\" data-line-number=\"167\"></td>\n        <td id=\"file-firestore_limit_test-go-LC167\" class=\"blob-code blob-code-inner js-file-line\">\t\t})</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L168\" class=\"blob-num js-line-number\" data-line-number=\"168\"></td>\n        <td id=\"file-firestore_limit_test-go-LC168\" class=\"blob-code blob-code-inner js-file-line\">\t}</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L169\" class=\"blob-num js-line-number\" data-line-number=\"169\"></td>\n        <td id=\"file-firestore_limit_test-go-LC169\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>_</span>, <span class=pl-s1>err</span> <span class=pl-c1>:=</span> <span class=pl-s1>batch</span>.<span class=pl-en>Commit</span>(<span class=pl-s1>ctx</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L170\" class=\"blob-num js-line-number\" data-line-number=\"170\"></td>\n        <td id=\"file-firestore_limit_test-go-LC170\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-en>panicIf</span>(<span class=pl-s1>err</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L171\" class=\"blob-num js-line-number\" data-line-number=\"171\"></td>\n        <td id=\"file-firestore_limit_test-go-LC171\" class=\"blob-code blob-code-inner js-file-line\">}</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L172\" class=\"blob-num js-line-number\" data-line-number=\"172\"></td>\n        <td id=\"file-firestore_limit_test-go-LC172\" class=\"blob-code blob-code-inner js-file-line\">\n</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L173\" class=\"blob-num js-line-number\" data-line-number=\"173\"></td>\n        <td id=\"file-firestore_limit_test-go-LC173\" class=\"blob-code blob-code-inner js-file-line\"><span class=pl-k>func</span> <span class=pl-en>updateServerTimestamp</span>(<span class=pl-s1>ctx</span> context.<span class=pl-smi>Context</span>, <span class=pl-s1>client</span> <span class=pl-c1>*</span>firestore.<span class=pl-smi>Client</span>, <span class=pl-s1>col</span> <span class=pl-c1>*</span>firestore.<span class=pl-smi>CollectionRef</span>, <span class=pl-s1>articles</span> <span class=pl-k>map</span>[<span class=pl-c1>*</span>firestore.<span class=pl-smi>DocumentRef</span>]<span class=pl-k>map</span>[<span class=pl-smi>string</span>]<span class=pl-k>interface</span>{}) {</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L174\" class=\"blob-num js-line-number\" data-line-number=\"174\"></td>\n        <td id=\"file-firestore_limit_test-go-LC174\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>batch</span> <span class=pl-c1>:=</span> <span class=pl-s1>client</span>.<span class=pl-en>Batch</span>()</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L175\" class=\"blob-num js-line-number\" data-line-number=\"175\"></td>\n        <td id=\"file-firestore_limit_test-go-LC175\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-k>for</span> <span class=pl-s1>col</span> <span class=pl-c1>:=</span> <span class=pl-k>range</span> <span class=pl-s1>articles</span> {</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L176\" class=\"blob-num js-line-number\" data-line-number=\"176\"></td>\n        <td id=\"file-firestore_limit_test-go-LC176\" class=\"blob-code blob-code-inner js-file-line\">\t\t<span class=pl-s1>batch</span>.<span class=pl-en>Update</span>(<span class=pl-s1>col</span>, []firestore.<span class=pl-smi>Update</span>{</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L177\" class=\"blob-num js-line-number\" data-line-number=\"177\"></td>\n        <td id=\"file-firestore_limit_test-go-LC177\" class=\"blob-code blob-code-inner js-file-line\">\t\t\t{<span class=pl-c1>Path</span>: <span class=pl-s>&quot;update_timestamp&quot;</span>, <span class=pl-c1>Value</span>: <span class=pl-s1>firestore</span>.<span class=pl-c1>ServerTimestamp</span>},</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L178\" class=\"blob-num js-line-number\" data-line-number=\"178\"></td>\n        <td id=\"file-firestore_limit_test-go-LC178\" class=\"blob-code blob-code-inner js-file-line\">\t\t})</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L179\" class=\"blob-num js-line-number\" data-line-number=\"179\"></td>\n        <td id=\"file-firestore_limit_test-go-LC179\" class=\"blob-code blob-code-inner js-file-line\">\t}</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L180\" class=\"blob-num js-line-number\" data-line-number=\"180\"></td>\n        <td id=\"file-firestore_limit_test-go-LC180\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>_</span>, <span class=pl-s1>err</span> <span class=pl-c1>:=</span> <span class=pl-s1>batch</span>.<span class=pl-en>Commit</span>(<span class=pl-s1>ctx</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L181\" class=\"blob-num js-line-number\" data-line-number=\"181\"></td>\n        <td id=\"file-firestore_limit_test-go-LC181\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-en>panicIf</span>(<span class=pl-s1>err</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L182\" class=\"blob-num js-line-number\" data-line-number=\"182\"></td>\n        <td id=\"file-firestore_limit_test-go-LC182\" class=\"blob-code blob-code-inner js-file-line\">}</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L183\" class=\"blob-num js-line-number\" data-line-number=\"183\"></td>\n        <td id=\"file-firestore_limit_test-go-LC183\" class=\"blob-code blob-code-inner js-file-line\">\n</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L184\" class=\"blob-num js-line-number\" data-line-number=\"184\"></td>\n        <td id=\"file-firestore_limit_test-go-LC184\" class=\"blob-code blob-code-inner js-file-line\"><span class=pl-k>func</span> <span class=pl-en>delete</span>(<span class=pl-s1>ctx</span> context.<span class=pl-smi>Context</span>, <span class=pl-s1>client</span> <span class=pl-c1>*</span>firestore.<span class=pl-smi>Client</span>, <span class=pl-s1>col</span> <span class=pl-c1>*</span>firestore.<span class=pl-smi>CollectionRef</span>, <span class=pl-s1>articles</span> <span class=pl-k>map</span>[<span class=pl-c1>*</span>firestore.<span class=pl-smi>DocumentRef</span>]<span class=pl-k>map</span>[<span class=pl-smi>string</span>]<span class=pl-k>interface</span>{}) {</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L185\" class=\"blob-num js-line-number\" data-line-number=\"185\"></td>\n        <td id=\"file-firestore_limit_test-go-LC185\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>batch</span> <span class=pl-c1>:=</span> <span class=pl-s1>client</span>.<span class=pl-en>Batch</span>()</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L186\" class=\"blob-num js-line-number\" data-line-number=\"186\"></td>\n        <td id=\"file-firestore_limit_test-go-LC186\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-k>for</span> <span class=pl-s1>col</span> <span class=pl-c1>:=</span> <span class=pl-k>range</span> <span class=pl-s1>articles</span> {</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L187\" class=\"blob-num js-line-number\" data-line-number=\"187\"></td>\n        <td id=\"file-firestore_limit_test-go-LC187\" class=\"blob-code blob-code-inner js-file-line\">\t\t<span class=pl-s1>batch</span>.<span class=pl-en>Delete</span>(<span class=pl-s1>col</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L188\" class=\"blob-num js-line-number\" data-line-number=\"188\"></td>\n        <td id=\"file-firestore_limit_test-go-LC188\" class=\"blob-code blob-code-inner js-file-line\">\t}</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L189\" class=\"blob-num js-line-number\" data-line-number=\"189\"></td>\n        <td id=\"file-firestore_limit_test-go-LC189\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>_</span>, <span class=pl-s1>err</span> <span class=pl-c1>:=</span> <span class=pl-s1>batch</span>.<span class=pl-en>Commit</span>(<span class=pl-s1>ctx</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L190\" class=\"blob-num js-line-number\" data-line-number=\"190\"></td>\n        <td id=\"file-firestore_limit_test-go-LC190\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-en>panicIf</span>(<span class=pl-s1>err</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L191\" class=\"blob-num js-line-number\" data-line-number=\"191\"></td>\n        <td id=\"file-firestore_limit_test-go-LC191\" class=\"blob-code blob-code-inner js-file-line\">}</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L192\" class=\"blob-num js-line-number\" data-line-number=\"192\"></td>\n        <td id=\"file-firestore_limit_test-go-LC192\" class=\"blob-code blob-code-inner js-file-line\">\n</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L193\" class=\"blob-num js-line-number\" data-line-number=\"193\"></td>\n        <td id=\"file-firestore_limit_test-go-LC193\" class=\"blob-code blob-code-inner js-file-line\"><span class=pl-k>func</span> <span class=pl-en>read</span>(<span class=pl-s1>ctx</span> context.<span class=pl-smi>Context</span>, <span class=pl-s1>col</span> <span class=pl-c1>*</span>firestore.<span class=pl-smi>CollectionRef</span>) {</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L194\" class=\"blob-num js-line-number\" data-line-number=\"194\"></td>\n        <td id=\"file-firestore_limit_test-go-LC194\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>fmt</span>.<span class=pl-en>Println</span>(<span class=pl-s>&quot;start&quot;</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L195\" class=\"blob-num js-line-number\" data-line-number=\"195\"></td>\n        <td id=\"file-firestore_limit_test-go-LC195\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>start</span> <span class=pl-c1>:=</span> <span class=pl-s1>time</span>.<span class=pl-en>Now</span>()</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L196\" class=\"blob-num js-line-number\" data-line-number=\"196\"></td>\n        <td id=\"file-firestore_limit_test-go-LC196\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>last</span>, <span class=pl-s1>err</span> <span class=pl-c1>:=</span> <span class=pl-s1>col</span>.<span class=pl-en>Where</span>(<span class=pl-s>&quot;view_count&quot;</span>, <span class=pl-s>&quot;&gt;=&quot;</span>, <span class=pl-c1>10000</span>).<span class=pl-en>Documents</span>(<span class=pl-s1>ctx</span>).<span class=pl-en>GetAll</span>()</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L197\" class=\"blob-num js-line-number\" data-line-number=\"197\"></td>\n        <td id=\"file-firestore_limit_test-go-LC197\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>fmt</span>.<span class=pl-en>Println</span>(<span class=pl-s1>time</span>.<span class=pl-en>Now</span>().<span class=pl-en>Sub</span>(<span class=pl-s1>start</span>))</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L198\" class=\"blob-num js-line-number\" data-line-number=\"198\"></td>\n        <td id=\"file-firestore_limit_test-go-LC198\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>fmt</span>.<span class=pl-en>Println</span>(<span class=pl-s>&quot;end&quot;</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L199\" class=\"blob-num js-line-number\" data-line-number=\"199\"></td>\n        <td id=\"file-firestore_limit_test-go-LC199\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>fmt</span>.<span class=pl-en>Println</span>(<span class=pl-s>&quot;count: &quot;</span>, <span class=pl-en>len</span>(<span class=pl-s1>last</span>))</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L200\" class=\"blob-num js-line-number\" data-line-number=\"200\"></td>\n        <td id=\"file-firestore_limit_test-go-LC200\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-en>panicIf</span>(<span class=pl-s1>err</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test-go-L201\" class=\"blob-num js-line-number\" data-line-number=\"201\"></td>\n        <td id=\"file-firestore_limit_test-go-LC201\" class=\"blob-code blob-code-inner js-file-line\">}</td>\n      </tr>\n</table>\n\n\n  </div>\n\n  </div>\n</div>\n\n      </div>\n      <div class=\"gist-meta\">\n        <a href=\"https://gist.github.com/yutakahashi114/f2452c02c5bf762daa39afeb04afe5eb/raw/e24aec530289ded32f30e290845d22e3a0bfe0b3/firestore_limit_test.go\" style=\"float:right\">view raw</a>\n        <a href=\"https://gist.github.com/yutakahashi114/f2452c02c5bf762daa39afeb04afe5eb#file-firestore_limit_test-go\">firestore_limit_test.go</a>\n        hosted with &#10084; by <a href=\"https://github.com\">GitHub</a>\n      </div>\n    </div>\n</div>\n\n<!--kg-card-end: html--><!--kg-card-begin: markdown--><p>3つの変数のうち登録件数は10,000件で固定し、一度のバッチ書き込みの件数、初回書き込み時の並列数を適当に変えて時間を測ってみました。結果は以下になります。</p>\n<p><img src=\"https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-11-10.05.15.png\" alt=\"----------2022-05-11-10.05.15\" loading=\"lazy\"></p>\n<p>500/s を大きく超えて最大 9407/s 出てました。実はそんなに気にしなくても大丈夫なのでしょうか。連続で試行したので既に十分スケールしていたのかもしれません。</p>\n<h2 id=\"500s-%E3%81%AB%E5%BC%95%E3%81%A3%E3%81%8B%E3%81%8B%E3%82%8B%E3%81%AE%E3%81%AF%E3%81%A9%E3%82%93%E3%81%AA%E6%9D%A1%E4%BB%B6%EF%BC%9F\">500/s に引っかかるのはどんな条件？</h2>\n<p>公式ドキュメントには条件として以下のように書かれています。</p>\n<blockquote>\n<p>Maximum write rate to a collection in which documents contain sequential values in an indexed field</p>\n</blockquote>\n<p>Increment 関数を使った更新が影響するのかと思い試しました。ついでにArrayUnion や ServerTimestamp も試してみました。登録件数は10,000件で固定です。結果は以下になります。</p>\n<p><img src=\"https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-11-10.05.58.png\" alt=\"----------2022-05-11-10.05.58\" loading=\"lazy\"></p>\n<p>殆ど変わりませんでした。逆にどうやったら引っかかるのでしょうか？</p>\n<h2 id=\"%E3%81%9D%E3%82%82%E3%81%9D%E3%82%82%E8%B2%A0%E8%8D%B7%E3%82%92%E5%BE%90%E3%80%85%E3%81%AB%E3%81%82%E3%81%92%E3%82%8B%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%82%8B%E3%81%AE%E3%81%8B%EF%BC%9F\">そもそも負荷を徐々にあげる必要があるのか？</h2>\n<p>色々試したくなってきたので、最初から負荷を高めで固定してみました。</p>\n<!--kg-card-end: markdown--><!--kg-card-begin: html--><!--<script src=\"https://gist.github.com/yutakahashi114/93c8561b788bf638c7f0e13a88f20d51.js\"></script>-->\n<link rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/gist-embed-f4c129808d1ba845285e410431c00f6d.css\">\n<div id=\"gist105569821\" class=\"gist\">\n    <div class=\"gist-file\" translate=\"no\">\n      <div class=\"gist-data\">\n        <div class=\"js-gist-file-update-container js-task-list-container file-box\">\n  <div id=\"file-firestore_limit_test_2-go\" class=\"file my-2\">\n    \n  <div itemprop=\"text\" class=\"Box-body p-0 blob-wrapper data type-go  \">\n\n      \n<table class=\"highlight tab-size js-file-line-container\" data-tab-size=\"8\" data-paste-markdown-skip>\n      <tr>\n        <td id=\"file-firestore_limit_test_2-go-L1\" class=\"blob-num js-line-number\" data-line-number=\"1\"></td>\n        <td id=\"file-firestore_limit_test_2-go-LC1\" class=\"blob-code blob-code-inner js-file-line\">\n</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test_2-go-L2\" class=\"blob-num js-line-number\" data-line-number=\"2\"></td>\n        <td id=\"file-firestore_limit_test_2-go-LC2\" class=\"blob-code blob-code-inner js-file-line\"><span class=pl-k>func</span> <span class=pl-en>exec2</span>(<span class=pl-s1>ctx</span> context.<span class=pl-smi>Context</span>, <span class=pl-s1>client</span> <span class=pl-c1>*</span>firestore.<span class=pl-smi>Client</span>, <span class=pl-s1>data</span> []<span class=pl-k>map</span>[<span class=pl-c1>*</span>firestore.<span class=pl-smi>DocumentRef</span>]<span class=pl-k>map</span>[<span class=pl-smi>string</span>]<span class=pl-k>interface</span>{},</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test_2-go-L3\" class=\"blob-num js-line-number\" data-line-number=\"3\"></td>\n        <td id=\"file-firestore_limit_test_2-go-LC3\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>execFunc</span> <span class=pl-k>func</span>(<span class=pl-s1>ctx</span> context.<span class=pl-smi>Context</span>, <span class=pl-s1>client</span> <span class=pl-c1>*</span>firestore.<span class=pl-smi>Client</span>, <span class=pl-s1>col</span> <span class=pl-c1>*</span>firestore.<span class=pl-smi>CollectionRef</span>, <span class=pl-s1>articles</span> <span class=pl-k>map</span>[<span class=pl-c1>*</span>firestore.<span class=pl-smi>DocumentRef</span>]<span class=pl-k>map</span>[<span class=pl-smi>string</span>]<span class=pl-k>interface</span>{})) {</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test_2-go-L4\" class=\"blob-num js-line-number\" data-line-number=\"4\"></td>\n        <td id=\"file-firestore_limit_test_2-go-LC4\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>col</span> <span class=pl-c1>:=</span> <span class=pl-s1>client</span>.<span class=pl-en>Collection</span>(<span class=pl-s>&quot;articles&quot;</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test_2-go-L5\" class=\"blob-num js-line-number\" data-line-number=\"5\"></td>\n        <td id=\"file-firestore_limit_test_2-go-LC5\" class=\"blob-code blob-code-inner js-file-line\">\n</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test_2-go-L6\" class=\"blob-num js-line-number\" data-line-number=\"6\"></td>\n        <td id=\"file-firestore_limit_test_2-go-LC6\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>fmt</span>.<span class=pl-en>Println</span>(<span class=pl-s>&quot;start&quot;</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test_2-go-L7\" class=\"blob-num js-line-number\" data-line-number=\"7\"></td>\n        <td id=\"file-firestore_limit_test_2-go-LC7\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>start</span> <span class=pl-c1>:=</span> <span class=pl-s1>time</span>.<span class=pl-en>Now</span>()</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test_2-go-L8\" class=\"blob-num js-line-number\" data-line-number=\"8\"></td>\n        <td id=\"file-firestore_limit_test_2-go-LC8\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>multi</span> <span class=pl-c1>:=</span> <span class=pl-c1>*</span><span class=pl-s1>multi</span></td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test_2-go-L9\" class=\"blob-num js-line-number\" data-line-number=\"9\"></td>\n        <td id=\"file-firestore_limit_test_2-go-LC9\" class=\"blob-code blob-code-inner js-file-line\">\n</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test_2-go-L10\" class=\"blob-num js-line-number\" data-line-number=\"10\"></td>\n        <td id=\"file-firestore_limit_test_2-go-LC10\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>limit</span> <span class=pl-c1>:=</span> <span class=pl-en>make</span>(<span class=pl-k>chan</span> <span class=pl-k>struct</span>{}, <span class=pl-s1>multi</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test_2-go-L11\" class=\"blob-num js-line-number\" data-line-number=\"11\"></td>\n        <td id=\"file-firestore_limit_test_2-go-LC11\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>wg</span> <span class=pl-c1>:=</span> <span class=pl-c1>&amp;</span>sync.<span class=pl-smi>WaitGroup</span>{}</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test_2-go-L12\" class=\"blob-num js-line-number\" data-line-number=\"12\"></td>\n        <td id=\"file-firestore_limit_test_2-go-LC12\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-k>for</span> <span class=pl-s1>_</span>, <span class=pl-s1>articles</span> <span class=pl-c1>:=</span> <span class=pl-k>range</span> <span class=pl-s1>data</span> {</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test_2-go-L13\" class=\"blob-num js-line-number\" data-line-number=\"13\"></td>\n        <td id=\"file-firestore_limit_test_2-go-LC13\" class=\"blob-code blob-code-inner js-file-line\">\t\t<span class=pl-s1>limit</span> <span class=pl-c1>&lt;-</span> <span class=pl-k>struct</span>{}{}</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test_2-go-L14\" class=\"blob-num js-line-number\" data-line-number=\"14\"></td>\n        <td id=\"file-firestore_limit_test_2-go-LC14\" class=\"blob-code blob-code-inner js-file-line\">\t\t<span class=pl-s1>wg</span>.<span class=pl-en>Add</span>(<span class=pl-c1>1</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test_2-go-L15\" class=\"blob-num js-line-number\" data-line-number=\"15\"></td>\n        <td id=\"file-firestore_limit_test_2-go-LC15\" class=\"blob-code blob-code-inner js-file-line\">\t\t<span class=pl-k>go</span> <span class=pl-k>func</span>(<span class=pl-s1>articles</span> <span class=pl-k>map</span>[<span class=pl-c1>*</span>firestore.<span class=pl-smi>DocumentRef</span>]<span class=pl-k>map</span>[<span class=pl-smi>string</span>]<span class=pl-k>interface</span>{}) {</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test_2-go-L16\" class=\"blob-num js-line-number\" data-line-number=\"16\"></td>\n        <td id=\"file-firestore_limit_test_2-go-LC16\" class=\"blob-code blob-code-inner js-file-line\">\t\t\t<span class=pl-en>execFunc</span>(<span class=pl-s1>ctx</span>, <span class=pl-s1>client</span>, <span class=pl-s1>col</span>, <span class=pl-s1>articles</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test_2-go-L17\" class=\"blob-num js-line-number\" data-line-number=\"17\"></td>\n        <td id=\"file-firestore_limit_test_2-go-LC17\" class=\"blob-code blob-code-inner js-file-line\">\t\t\t<span class=pl-c1>&lt;-</span><span class=pl-s1>limit</span></td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test_2-go-L18\" class=\"blob-num js-line-number\" data-line-number=\"18\"></td>\n        <td id=\"file-firestore_limit_test_2-go-LC18\" class=\"blob-code blob-code-inner js-file-line\">\t\t\t<span class=pl-s1>wg</span>.<span class=pl-en>Done</span>()</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test_2-go-L19\" class=\"blob-num js-line-number\" data-line-number=\"19\"></td>\n        <td id=\"file-firestore_limit_test_2-go-LC19\" class=\"blob-code blob-code-inner js-file-line\">\t\t}(<span class=pl-s1>articles</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test_2-go-L20\" class=\"blob-num js-line-number\" data-line-number=\"20\"></td>\n        <td id=\"file-firestore_limit_test_2-go-LC20\" class=\"blob-code blob-code-inner js-file-line\">\t}</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test_2-go-L21\" class=\"blob-num js-line-number\" data-line-number=\"21\"></td>\n        <td id=\"file-firestore_limit_test_2-go-LC21\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>wg</span>.<span class=pl-en>Wait</span>()</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test_2-go-L22\" class=\"blob-num js-line-number\" data-line-number=\"22\"></td>\n        <td id=\"file-firestore_limit_test_2-go-LC22\" class=\"blob-code blob-code-inner js-file-line\">\n</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test_2-go-L23\" class=\"blob-num js-line-number\" data-line-number=\"23\"></td>\n        <td id=\"file-firestore_limit_test_2-go-LC23\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>fmt</span>.<span class=pl-en>Println</span>(<span class=pl-s1>time</span>.<span class=pl-en>Now</span>().<span class=pl-en>Sub</span>(<span class=pl-s1>start</span>))</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test_2-go-L24\" class=\"blob-num js-line-number\" data-line-number=\"24\"></td>\n        <td id=\"file-firestore_limit_test_2-go-LC24\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>fmt</span>.<span class=pl-en>Println</span>(<span class=pl-s>&quot;end&quot;</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test_2-go-L25\" class=\"blob-num js-line-number\" data-line-number=\"25\"></td>\n        <td id=\"file-firestore_limit_test_2-go-LC25\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-s1>last</span>, <span class=pl-s1>err</span> <span class=pl-c1>:=</span> <span class=pl-s1>col</span>.<span class=pl-en>OrderBy</span>(<span class=pl-s>&quot;view_count&quot;</span>, <span class=pl-s1>firestore</span>.<span class=pl-c1>Desc</span>).<span class=pl-en>Limit</span>(<span class=pl-c1>1</span>).<span class=pl-en>Documents</span>(<span class=pl-s1>ctx</span>).<span class=pl-en>GetAll</span>()</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test_2-go-L26\" class=\"blob-num js-line-number\" data-line-number=\"26\"></td>\n        <td id=\"file-firestore_limit_test_2-go-LC26\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-en>panicIf</span>(<span class=pl-s1>err</span>)</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test_2-go-L27\" class=\"blob-num js-line-number\" data-line-number=\"27\"></td>\n        <td id=\"file-firestore_limit_test_2-go-LC27\" class=\"blob-code blob-code-inner js-file-line\">\t<span class=pl-k>if</span> <span class=pl-en>len</span>(<span class=pl-s1>last</span>) <span class=pl-c1>&gt;</span> <span class=pl-c1>0</span> {</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test_2-go-L28\" class=\"blob-num js-line-number\" data-line-number=\"28\"></td>\n        <td id=\"file-firestore_limit_test_2-go-LC28\" class=\"blob-code blob-code-inner js-file-line\">\t\t<span class=pl-s1>fmt</span>.<span class=pl-en>Println</span>(<span class=pl-s1>last</span>[<span class=pl-c1>0</span>].<span class=pl-en>Data</span>()[<span class=pl-s>&quot;view_count&quot;</span>])</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test_2-go-L29\" class=\"blob-num js-line-number\" data-line-number=\"29\"></td>\n        <td id=\"file-firestore_limit_test_2-go-LC29\" class=\"blob-code blob-code-inner js-file-line\">\t}</td>\n      </tr>\n      <tr>\n        <td id=\"file-firestore_limit_test_2-go-L30\" class=\"blob-num js-line-number\" data-line-number=\"30\"></td>\n        <td id=\"file-firestore_limit_test_2-go-LC30\" class=\"blob-code blob-code-inner js-file-line\">}</td>\n      </tr>\n</table>\n\n\n  </div>\n\n  </div>\n</div>\n\n      </div>\n      <div class=\"gist-meta\">\n        <a href=\"https://gist.github.com/yutakahashi114/93c8561b788bf638c7f0e13a88f20d51/raw/1f690cca8034fcd76bf436d5b931625a8f7e9b6b/firestore_limit_test_2.go\" style=\"float:right\">view raw</a>\n        <a href=\"https://gist.github.com/yutakahashi114/93c8561b788bf638c7f0e13a88f20d51#file-firestore_limit_test_2-go\">firestore_limit_test_2.go</a>\n        hosted with &#10084; by <a href=\"https://github.com\">GitHub</a>\n      </div>\n    </div>\n</div>\n\n<!--kg-card-end: html--><!--kg-card-begin: markdown--><p>単純な並列化に変更しました。こちらも登録件数は10,000件で固定しています。結果は以下になります。</p>\n<p><img src=\"https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-11-10.07.12.png\" alt=\"----------2022-05-11-10.07.12\" loading=\"lazy\"></p>\n<p>さらに速くなりました。本当に計測方法が合っているのか不安になってきました。一応更新後に件数を確認し、更新されていることを確認しました。こちらも連続で試行していたので、既に十分スケールしていたのかもしれません。</p>\n<p>以後の計測は負荷を徐々に上げず、単純な並列化で試しています。</p>\n<p>削除の速度も測りました。あまり重視していないので1条件だけです。(最初から測定しておけばよかった）</p>\n<p><img src=\"https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-11-10.08.29.png\" alt=\"----------2022-05-11-10.08.29\" loading=\"lazy\"></p>\n<p>更新より少し遅いくらいでした。</p>\n<h2 id=\"%E6%9C%80%E5%A4%A7%E4%BD%95%E4%BB%B6%E3%81%BE%E3%81%A7%E6%88%90%E5%8A%9F%E3%81%99%E3%82%8B%E3%81%8B\">最大何件まで成功するか</h2>\n<p>登録件数を変えていくつか試してみました。効果があるか分かりませんが、1条件ごとに2,3時間おいて試しました。結果は以下になります。</p>\n<p><img src=\"https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-11-10.09.36.png\" alt=\"----------2022-05-11-10.09.36\" loading=\"lazy\"></p>\n<p>40,000件は成功、50,000件は登録中にエラーとなりました。エラーが起きた後に確認しましたが、49,000件くらいまでは登録できていました。</p>\n<h2 id=\"%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E6%95%B0%E3%82%922%E5%80%8D%E3%81%AB%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B\">リクエスト数を2倍にしてみる</h2>\n<p>最後にインスタンスをもう一台立て、2つのインスタンスでほぼ同時に実行してみました。</p>\n<p><img src=\"https://ghost.tech.anti-pattern.co.jp/content/images/2022/05/----------2022-05-11-10.10.16.png\" alt=\"----------2022-05-11-10.10.16\" loading=\"lazy\"></p>\n<p>40,000件 * 2 までは遅くなっているものの成功、50,000件 * 2 の更新で両方エラーになりました。思ったよりだいぶ耐えました。</p>\n<h2 id=\"%E3%81%BE%E3%81%A8%E3%82%81\">まとめ</h2>\n<p>予想以上に書き込み可能件数が多かったです。自分で調べておいて何ですが合っているか不安なので、どこか間違ってたら教えていただけると非常に助かります。</p>\n<!--kg-card-end: markdown-->","url":"https://ghost.tech.anti-pattern.co.jp/firestoren-write/","canonical_url":null,"uuid":"1bb8095f-9ae2-4b22-a946-ba8ce7183984","page":null,"codeinjection_foot":null,"codeinjection_head":null,"codeinjection_styles":null,"comment_id":"6103f3e53986b000013a44b3","reading_time":8}},"pageContext":{"slug":"firestoren-write"}},
    "staticQueryHashes": ["176528973","2358152166","2561578252","2731221146","4145280475"]}