Firestoreにデータを一括登録したい。

# Firestoreにデータを一括登録する方法 - Node.js Admin SDKを使った実践ガイド

## はじめに

Firebase Firestoreを使用したアプリケーション開発では、初期データの登録やテストデータの準備が必要になることがあります。
特に、多数のドキュメントを一度に登録する場合、手動での作業は泣けるほど面倒です。

この記事では、Node.jsとFirebase Admin SDKを使用して、Firestoreにデータを一括で登録する方法を解説します。コレクションに固定値を簡単かつ効率的に登録する手順を、実践的なサンプルコードとともに紹介します。

## 必要なもの

* Node.jsがインストールされた環境
* Firebase Admin SDK用のサービスアカウントキーファイル
* npm（Node.jsのパッケージマネージャー）

## 手順1: Firebase Consoleからサービスアカウントキーを取得する

まず最初に、Firebase Admin SDKを使用するためのサービスアカウントキーを取得します。

1. [Firebase Console](https://console.firebase.google.com/)にアクセスし、プロジェクトを選択します。

2. 左側のメニューから「プロジェクト設定」 > 「サービスアカウント」タブ > 「新しい秘密鍵の生成」ボタンをクリックし、JSONファイルをダウンロード。

5. ダウンロードしたJSONファイルを安全な場所に保存します（このファイルは秘密鍵なので公開しないでくださいと注意ポップアップがでます）。

## 手順2: プロジェクトセットアップ

新しいディレクトリを作成し、必要なパッケージをインストールします。

```bash
# 新しいディレクトリを作成
mkdir firestore-data-upload
cd firestore-data-upload

# package.jsonを初期化
npm init -y

# firebase-adminパッケージをインストール
npm install firebase-admin
```

## 手順3: スクリプトファイルの作成

次に、データを一括登録するためのスクリプトファイルを作成します。`upload-data.js`という名前のファイルを作成し、以下のコードを記述します。

```javascript
// upload-data.js
const admin = require('firebase-admin');
const serviceAccount = require('./your-service-account-key.json'); // ダウンロードしたキーファイルへのパス

// Admin SDKの初期化
admin.initializeApp({
  credential: admin.credential.cert(serviceAccount)
});

const db = admin.firestore();

// 登録するサンプルデータ（例：製品リスト）
const sampleData = [
  { id: "item1", name: "製品A", price: 1000, category: "電子機器", inStock: true },
  { id: "item2", name: "製品B", price: 2000, category: "家具", inStock: true },
  { id: "item3", name: "製品C", price: 1500, category: "電子機器", inStock: false },
  { id: "item4", name: "製品D", price: 3000, category: "家具", inStock: true },
  { id: "item5", name: "製品E", price: 2500, category: "食品", inStock: true },
  { id: "item6", name: "製品F", price: 800, category: "食品", inStock: false },
  { id: "item7", name: "製品G", price: 4000, category: "電子機器", inStock: true },
  { id: "item8", name: "製品H", price: 1200, category: "衣類", inStock: true },
  { id: "item9", name: "製品I", price: 900, category: "衣類", inStock: false },
  { id: "item10", name: "製品J", price: 1800, category: "電子機器", inStock: true }
];

// コレクション名を定義
const COLLECTION_NAME = 'products';

// バッチ処理を使用してデータを一括登録する関数
async function uploadDataInBatch() {
  // 一度に処理できるドキュメント数には制限があるため、バッチに分けて処理
  const MAX_BATCH_SIZE = 500; // Firestoreの最大バッチサイズは500
  const batches = [];
  
  // データを適切なサイズのバッチに分割
  for (let i = 0; i < sampleData.length; i += MAX_BATCH_SIZE) {
    const batch = db.batch();
    const chunk = sampleData.slice(i, i + MAX_BATCH_SIZE);
    
    chunk.forEach((item) => {
      const docRef = db.collection(COLLECTION_NAME).doc(item.id);
      // idフィールドを除外してドキュメントデータを作成
      const { id, ...data } = item;
      batch.set(docRef, data);
    });
    
    batches.push(batch.commit());
  }
  
  try {
    // すべてのバッチをコミット
    await Promise.all(batches);
    console.log(`${sampleData.length}件のデータを${COLLECTION_NAME}コレクションに登録しました`);
  } catch (error) {
    console.error('データ登録中にエラーが発生しました:', error);
  }
}

// データ登録を実行
uploadDataInBatch().then(() => {
  console.log('処理が完了しました');
  process.exit(0);
}).catch(error => {
  console.error('エラーが発生しました:', error);
  process.exit(1);
});
```

このスクリプトでは、以下のことを行っています：
- Firebase Admin SDKの初期化
- サンプルデータの定義
- バッチ処理を使用したデータの一括登録
- Firestoreのバッチサイズ制限（500ドキュメント）への対応

## 手順4: サービスアカウントキーファイルを配置

ダウンロードしたJSONファイル（サービスアカウントキー）をスクリプトファイルと同じディレクトリに配置し、スクリプト内のパスを正しく設定します。

例えば、ダウンロードしたキーのファイル名が `my-project-firebase-adminsdk-abc123.json` の場合：

```javascript
const serviceAccount = require('./my-project-firebase-adminsdk-abc123.json');
```

## 手順5: スクリプトの実行

準備が整ったら、以下のコマンドでスクリプトを実行します。

```bash
node upload-data.js
```

スクリプトが正常に実行されると、コンソールに処理結果が表示されます。

## 実行結果の確認

Firestoreコンソールで登録されたデータを確認できます。

1. [Firebase Console](https://console.firebase.google.com/)にアクセス
2. プロジェクトを選択 → Firestore Database → データタブ
3. 「products」コレクションを選択して登録されたデータを確認して登録できていればおめでとう㊗️