Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
17
Help us understand the problem. What is going on with this article?
@zaburo

FirestoreでBatch処理

More than 1 year has passed since last update.

FirestoreではTransaction処理が可能ですが、件数が多い場合はBatch処理を使うほうがいいみたいです。
が、Batch処理には500件以上を一度に処理できないとう制限があるので、その検証と回避方法についてテストしてみます。

準備・前提

  • membersコレクションを作成して500件以上のデータを作成しておく。
  • membersコレクションにはstatusフィールドがあり、基本falseになっている。
  • ローカルで実行するnodeスクリプトを想定。

コード1(500件対応なし)

statusがfalseになっているのをtrueにするバッチ。

const admin = require('firebase-admin');

admin.initializeApp({
    credential: admin.credential.cert('/path/to/key.json'),
    databaseURL: 'https://xxxxxxxxxx.firebase.com',
});

const db = admin.firestore();
//batchインスタンス生成
let batch = db.batch();

(async () => {

    //collectionからデーを取得
    const snapshots = await db.collection("members").get();
    //ループしながら・・・
    const docs = snapshots.docs.map((doc, index) => {

        //update
        batch.update(doc.ref, { status: false })
    });

    //最終commit
    batch.commit();

})()

これを実行すると、

Error: 3 INVALID_ARGUMENT: maximum 500 writes allowed per request

というエラーになる。

コード2(500件対応あり)

500件毎にcommit()を実行して500件制限を回避します。

const admin = require('firebase-admin');

admin.initializeApp({
    credential: admin.credential.cert('/path/to/key.json'),
    databaseURL: 'https://xxxxxxxxxx.firebase.com',
});

const db = admin.firestore();
//batchインスタンス生成
let batch = db.batch();

(async () => {

    //collectionからデーを取得
    const snapshots = await db.collection("members").get();
    //ループしながら・・・
    const docs = snapshots.docs.map((doc, index) => {

+        //500件毎にcommitしてbatchインスタンスを初期化
+        if ((index + 1) % 500 === 0) {
+            batch.commit(); //新しいインスタンス
+            batch = db.batch(); //新たにインスタンスを生成。
+        }

        //update
        batch.update(doc.ref, { status: false })
    });

    //最終commit
    batch.commit();

})()
17
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
zaburo
こんにちは。自分用のメモをだらだら公開しています。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
17
Help us understand the problem. What is going on with this article?