Firebase(もといNoSQL系)に関しては初心者なものです!
Firestoreのテーブルをまたいで、複数のドキュメントに対して、forEachで更新をかけたいのですが、処理の負荷(?)の影響なのか、関数を走らせた後も一向にDBが更新される様子が見られないのです
js
1const firestore = admin.firestore(); 2 3firestore.collection("users").get().then(snap => { 4 snap.forEach(doc => { 5 const user = doc.data(); 6 firestore.collection("rooms").doc(user.roomId).update({timezone: user.timezone}) 7 }) 8})
この処理自体はCloudFunctionでダミーの関数をアップして、それを手動で直接呼び出している感じです(あまりいい方法ではないかもですが)
その方法で実行すると、limit
などで、usersコレクションのうちの少数にだけ更新処理を実施する場合にはうまく行くのですが、コレクション全体(700件くらい)に対して一気にforEachでやろうとすると、どうしたわけかいつまでたってもDBが更新されないのです。
何かエラーログが吐かれているわけでもないようです。
大量のデータ更新はできないものなのでしょうか?
その場合、どのようにしたらうまく行くのでしょうか?
よろしくお願いいたします
追記:
以下のように書き換えてみたところ、原因はタイムアウトエラーによるものであることが判明しました
js
1firestore.collection("users").get().then(snap => { 2 let promises = []; 3 snap.forEach(doc => { 4 const user = doc.data(); 5 promises.push(firestore.collection("rooms").doc(user.roomId).update({timezone: user.timezone})); 6 }) 7 return Promise.all(promises) 8}).catch(err => { 9 console.log(`err: ${err}`); 10 // err: Error: Retry total timeout exceeded before any response was received 11})
おそらくは実行元がクラウドファンクションであることも一因であるかもとは思うのですが、タイムアウトエラーを起こさずに、700件近くのドキュメントを同時に更新するにはどのような手法があるのでしょうか?
そういったクエリを管理者的に、権限を無視してFirestoreに送りつけられる方法がありましたら教えて欲しいです!
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/30 23:08
2020/03/30 23:11