Firestore、便利だけど一括取得とか一括実行をGUIでやるのがつらい。。
スクリプトでできないかなと思っていたら、できるっぽいので調べてみたときの備忘録。
テストデータ生成とか不要データの削除とかいろいろ使えそう(´ω`)
ディレクトリ構成
my-admin/ - key/ - xxxxx.json # サービスアカウントの秘密鍵 - index.js - package.json - .gitignore
初期設定
# ディレクトリの作成 $ mkdir my-admin $ cd my-admin $ mkdir key # package.jsonの作成とパッケージの追加 $ npm init -f $ npm i -S firebase-admin # jsファイルの作成 $ touch index.js # 秘密鍵をコミットしないように、.gitignoreの作成 echo "key/*.json" > .gitignore
サービスアカウントの秘密鍵の生成と配置
Firebaseのコンソールに移動して、ダウンロードする
- プロジェクトコンソールに移動
- 「歯車マーク」をクリック
- 「ユーザと権限」をクリック
- 「サービスアカウント」タブを選択
- 「新しい秘密鍵を生成」をクリック
ダウンロードしたファイルをkey/
配下に配置。
index.jsの中身
const admin = require("firebase-admin"); // 配置したサービスアカウントの秘密鍵を取得 const serviceAccount = require("./key/XXXXX.json"); // firebase-adminを初期化 admin.initializeApp({ credential: admin.credential.cert(serviceAccount) }); // firestoreのインスタンスを取得 const db = admin.firestore(); /** * userにあるdocを取得 */ async function getUsers() { const ref = db.collection("users"); const snapshot = await ref.get(); return snapshot.docs.map(s => s.data()); } // **************************** // * MAIN // **************************** async function main() { console.log(`***** START MAIN *****`); const users = await getUsers(); users.forEach((v) => console.log(`user=${JSON.stringify(v)}`)) console.log(`***** END MAIN *****`); } main().then();
async/awaitを使いたいので、main()を作って、main().then()
で呼び出してる感じに。
実行する
実行はこんな感じ〜
$ node index.js
package.jsonに追加しておいてもよいかも
{ "scripts": { "main": "node index.js" }, }
実行は、こんな感じ(´ω`)
$ npm run main
注意
一括更新できるドキュメントの件数には上限があるので、
大量に行う場合は件数を分けて再帰的に実行する必要がある。。
公式ドキュメントなどを参照 TypeScript版は、こちら)
以上!!