1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Firestoreにデータを一括登録したい。(応用編)

Posted at

Firestoreにデータを一括登録したい。の続き。
なんでドキュメント追加はこんなにめんどいんや...
コレクションの中のドキュメントは同じ型でコピペ追加、編集させてほしい(ToT)

異なるデータ構造に対応する

異なるデータ構造や複数のコレクションにデータを登録する場合は、スクリプトを拡張することができます。

// 複数コレクションに異なるデータを登録する例
async function uploadMultipleCollections() {
  // 製品データのバッチ処理
  const productBatch = db.batch();
  sampleProducts.forEach(product => {
    const docRef = db.collection('products').doc(product.id);
    const { id, ...data } = product;
    productBatch.set(docRef, data);
  });
  
  // ユーザーデータのバッチ処理
  const userBatch = db.batch();
  sampleUsers.forEach(user => {
    const docRef = db.collection('users').doc(user.id);
    const { id, ...data } = user;
    userBatch.set(docRef, data);
  });
  
  try {
    // 両方のバッチをコミット
    await Promise.all([productBatch.commit(), userBatch.commit()]);
    console.log('複数コレクションへのデータ登録が完了しました');
  } catch (error) {
    console.error('データ登録中にエラーが発生しました:', error);
  }
}

データを更新または追加(アップサート)する場合

既存のドキュメントを更新し、存在しない場合は新規作成したい場合は、setメソッドに{merge: true}オプションを追加します。

batch.set(docRef, data, { merge: true });

このオプションを使用すると、既存のドキュメントの他のフィールドを維持したまま特定のフィールドのみを更新できます。

CSVファイルからデータを読み込む例

実際のプロジェクトでは、スプレッドシートなどで値を管理して、それを反映させたいってことは多くないですか?
そんなときはCSVファイルからデータを読み込んでみましょう。

まず、CSVパーサーをインストールします:

npm install csv-parser fs

CSVファイルからデータを読み込むスクリプト:

const fs = require('fs');
const csv = require('csv-parser');
const admin = require('firebase-admin');

// Admin SDKの初期化(前述と同じ)

// CSVファイルからデータを読み込む関数
function loadDataFromCSV(filePath) {
  return new Promise((resolve, reject) => {
    const results = [];
    
    fs.createReadStream(filePath)
      .pipe(csv())
      .on('data', (data) => results.push(data))
      .on('end', () => resolve(results))
      .on('error', (error) => reject(error));
  });
}

// メイン処理
async function main() {
  try {
    // CSVからデータを読み込む
    const data = await loadDataFromCSV('./data.csv');
    
    // バッチ処理でFirestoreに登録
    const batch = db.batch();
    data.forEach((item, index) => {
      // idがない場合はインデックスを使用
      const id = item.id || `doc-${index}`;
      const docRef = db.collection('items').doc(id);
      batch.set(docRef, item);
    });
    
    await batch.commit();
    console.log(`${data.length}件のデータを登録しました`);
  } catch (error) {
    console.error('エラーが発生しました:', error);
  }
}

main();

パフォーマンスと制限事項

Firestoreのバッチ処理を使用する際の注意点:

  1. バッチサイズの制限: 1つのバッチで最大500のドキュメント操作が可能です。それ以上のデータを処理する場合は、複数のバッチに分割する必要があるみたいです。

  2. コスト: 書き込み操作はFirestoreの課金対象です。大量のデータを登録する前に、コストを確認しましょう!

  3. レート制限: 短時間に大量の書き込みを行うと、レート制限に達する可能性があります。その場合は、書き込み速度を調整したり、エラーハンドリングを実装したりする必要があります。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?