Firestoreで複数のドキュメントを同時にset()したい
set multiple document ad once, in Firestore.
結論
const setMultipleDocument = async () => { const userList = ['userA', 'userB', 'userC', ] const db = firebase.firestore(); const date = new Date(); const currentTime = date.getTime(); const batch = db.batch(); // rooms has many users const userDocRef = db.collection("rooms").doc('DEFIND_ROOM_UUID').collection('users'); await userList.map((userName) => { batch.set(userDocRef.doc(), { name: userName, createdAt: currentTime, }) }) await batch.commit(); }
概要
- Firestoreにおけるバッチ(batch)とトランザクション(transaction)の違いはドキュメントが分かりやすい https://firebase.google.com/docs/firestore/manage-data/transactions?hl=ja
- 今回はトランザクションを貼る必要がなく、複数のドキュメント(user)を一つの関数の中でn個
set()
したいというケース
詳細
const setMultipleDocument = async () => { // userListを定義しておく const userList = ['userA', 'userB', 'userC', ] // dbという変数名が一般的ぽいのでこうしておく。ここはfirestoreの通常のset時と変わらない const db = firebase.firestore(); // ここもただ単にcurrentTimeを取得しているだけ const date = new Date(); const currentTime = date.getTime();
ここまでが前準備。
// 新しくbatchを取得するだけ const batch = db.batch(); // 複数ドキュメントを作成したい親ドキュメントに対してrefを定義する。 const userDocRef = db.collection("rooms").doc('DEFIND_ROOM_UUID').collection('users'); // await つけつつ、Listをmapで一つずつ回して、batchにsetしていく await userList.map((userName) => { batch.set(userDocRef.doc(), { name: userName, createdAt: currentTime, }) }) // この段階でbatchの中には追加(set)された値が入っている状態 // そして、ここでその値をcommitする await batch.commit();