Firestore中如何将指定条件的数据从一个集合复制到另一个集合
Firebase 跨集合复制数据修正方案
原代码存在的问题
- 未添加日期过滤条件,会拉取todo集合的全量文档,不符合仅筛选2021-08-14数据的需求
- 集合引用无法直接调用
set()方法:todoRefTo是集合类型的引用,set()方法仅适用于文档类型引用,需要为写入的目标文档指定ID - 异步逻辑处理不规范:forEach中直接使用async函数不会等待所有写入操作完成,无法捕获异常,也不能保证所有数据都写入成功
- 数据转换冗余:
doc.data()已经返回可直接写入Firestore的普通对象,不需要额外做Map转换
修正后可运行代码
const db = firebase.firestore(); const todoRefFrom = db.collection('todo'); // 若目标集合名称为单数template,修改此处参数即可 const todoRefTo = db.collection('templates'); // 此处假设日期字段名为date,存储格式为"2021-08-14"字符串 const todosQuery = todoRefFrom.where('date', '==', '2021-08-14'); const todosSnapshot = await todosQuery.get(); // 批量处理所有写入操作,等待全部完成/抛出异常 const writeTasks = todosSnapshot.docs.map(async (todoDoc) => { // 沿用原文档ID写入新集合,如需自动生成新ID,替换为 todoRefTo.doc() const targetDocRef = todoRefTo.doc(todoDoc.id); await targetDocRef.set(todoDoc.data()); console.log('成功复制文档:', todoDoc.id); }); await Promise.all(writeTasks); console.log('所有数据复制完成');
特殊情况适配
如果你的日期字段存储的是Firestore Timestamp类型,将上述代码中的查询条件替换为如下范围查询即可:
const startDate = new Date('2021-08-14 00:00:00'); const endDate = new Date('2021-08-14 23:59:59'); const todosQuery = todoRefFrom.where('date', '>=', startDate).where('date', '<=', endDate);
内容的提问来源于stack exchange,提问作者Jerry Seigle
相关产品推荐
相关产品推荐

