くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

ローカルPCからfirebase-adminを使ってFirestoreを操作する(管理ツール)

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のコンソールに移動して、ダウンロードする

  1. プロジェクトコンソールに移動
  2. 「歯車マーク」をクリック
  3. 「ユーザと権限」をクリック
  4. 「サービスアカウント」タブを選択
  5. 「新しい秘密鍵を生成」をクリック

ダウンロードしたファイルを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版は、こちら)

以上!!

参考にしたサイト様