Help us understand the problem. What is going on with this article?

FirestoreでBatch処理

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();

})()
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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした