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つのバッチで最大500のドキュメント操作が可能です。それ以上のデータを処理する場合は、複数のバッチに分割する必要があるみたいです。
-
コスト: 書き込み操作はFirestoreの課金対象です。大量のデータを登録する前に、コストを確認しましょう!
-
レート制限: 短時間に大量の書き込みを行うと、レート制限に達する可能性があります。その場合は、書き込み速度を調整したり、エラーハンドリングを実装したりする必要があります。