質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

1回答

1528閲覧

Firebaseにおける大量データ書き込みの際のエラーハンドリングについて

daikitakaya

総合スコア229

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2017/10/31 09:55

編集2017/10/31 09:56

###前提・実現したいこと
現在、RDBにあるデータをFirebaseのCloud Firestoreにデータ移行したいと考えています。
RDBのデータをCSVファイルに書き出すこところができています。

###詰まっていること、悩んでいること

Node.js で移行スクリプトを書いているのですが、データ移行の際に気をつけることやエラーハンドリングについてどのようにしたら良いのかわかっていません。

  1. dbへの書き込み処理でエラーを起こした際の対処
  2. データ移行について一般的に考慮すべきこと
  3. csvから読み出したデータの扱い方について、下に示すようにarray[0]のように扱うよりももっと良いベストプラクティスがあるのではないか?

などを知りたいと思っています。

現在、いかに示すスクリプトを実行するとほとんどのデータは書き込みできているのですが、いくつかのデータでは以下のようなエラーが出ます。

(node:97867) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 598): Error: Deadline Exceeded

###該当のソースコード
csvファイルは以下のようになっています。(参考ファイルです。)
id,名前,性別,住所

(住所が欠損しているデータがあるとしています)

users.csv

1 21,Sam,male,Saitama 32,Tom,male,Tokyo 43,Taylor,female 5

このようなcsvファイルが900行近くあり、それを全て書き込み処理をしたいと考えています。

Node.js

1const firebaseAdmin = require('firebase-admin') 2 3// 認証設定 4const serviceAccount = require('./env-firebase-dev-firebase-xxx.json') 5firebaseAdmin.initializeApp({ 6 credential: firebaseAdmin.credential.cert(serviceAccount), 7 databaseURL: process.env.FIREBASE_DATABASE_URL 8}) 9 10const db = firebaseAdmin.firestore() 11const usersRef = db.collection('users') 12 13// csvファイルの読み込み設定 14const fs = require('fs') 15const csvSync = require('csv-parse/lib/sync') 16const file = 'dump.csv' 17let data = fs.readFileSync(file) 18let res = csvSync(data) 19 20// 書き込み処理 21res.forEach(function(user) { 22 #addでレコードを新規作成する 23 usersRef.add({ 24 id: Number(user[0]), 25 name: user[1], 26 sex: user[2], 27 address: user[3] 28 }) 29}, this); 30

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

dbへの書き込み処理でエラーを起こした際の対処

Error: Deadline Exceededとある通り,時間かかり過ぎで怒られているようです.
CSVの分割が簡単な対処ではないでしょうか.

データ移行について一般的に考慮すべきこと

まずそもそもの話ですが,realtime databaseのほうが場合によってメリットもあることはご認識ください.
・読み書きの非常に多いサービスでは,Firestoreより安くなりやすい(お絵かきチャットなど)
・全般的に少し簡単
・オフライン検知ができる
・低レイテンシ,反映が速い

具体的な移行ベストプラクティスに関しては,まだまだコミュニティ全体としてもノウハウ蓄積待ちの状態とは思いますが,
ひとまず推奨できることとして,batch()を利用した一括書き込み(Batched writes)は,多くの場合で速度向上につながるかと思われます.

それから,データ構造など少し違うのはもちろんですが,セキュリティルールについても違うためご確認ください

csvから読み出したデータの扱い方について、下に示すようにarray[0]のように扱うよりももっと良いベストプラクティスがあるのではないか?

書き込むFirestore内でのデータ構造ではなく,単に読み込んだCSVデータの扱い,ということでしょうか?
移行は一時的なものですし,そもそもあまりそこにこだわる意味はないのではないか,と思いますが,いかがでしょうか.

投稿2017/10/31 11:09

Yatima

総合スコア1159

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

daikitakaya

2017/11/02 13:12

ありがとうございます。 csvの分割は確かに必要でした。どうやら一度に書き込む量は500件までらしいです。 データの書き込みに関しては、transactionを使って分割したcsvで書き込むことにしました。 return db.runTransaction(function(transaction) { // データ書き込みの原子性を担保 return transaction.get(usersRef).then(doc => { users.forEach(function(person) { if (shop.shop_status === 'male') { transaction.set(mansRef.doc(), shop) } else if (user.sex === 'female') { transaction.set(womensRef.doc(), shop) } }, this); }) }).then(function() { console.log('データ移行に成功しました'); }).catch(function(error) { console.log("失敗したぜ: ", error); }); ただ、ブログにひもづくコメントテーブルなど、リレーション関係を持ったテーブルの移行ではかなりてこづっています。。。。 real time databaseは確かに早くていいですよね。 firestoreを使い始めて改めて感じました。ですが、クエリの表現がいまいち少ない印象なので、思い切ってfirestoreを使ってみました。
Yatima

2017/11/02 13:47

どう手こずっているのか,もう少し具体的に書いていただくと手助けできるかもしれませんが, 煩雑になってくる/題意とも少しズレてくるでしょうから,質問立て直しが良いかもしれません.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問