我需要从一个集合中获取一个文档数组,并将该文档迁移到另一个集合中。
所以我创建了一个查询来获取第一个集合中的所有文档:
const orderQuery = db.collection("FIRST_COLLECTION").where("status", "==", "ACTIVE").get();
const orders: Order[] = mapToObject<Order>(orderQuery); //here I map query from firestore to objects
,遍历这个数组和add
到另一个集合:
const secondCollectionQuery = db.collection("SECOND_COLLECTION").doc("ID").collection("THIRD_COLLECTION");
for await (const order from orders) {
secondCollectionQuery.add(order);
}
是否有更好的方法将文档从一个集合迁移到另一个集合?谢谢你的帮助!
p。当文档迁移到另一个集合时,我还想从集合中删除文档,我不希望有重复的
您可以将这些add()
推入数组中,然后使用Promise.all()
将它们一起运行(或使用批处理写入并以500批为单位迁移它们)。此外,第一个查询返回的承诺似乎没有得到正确处理。试着运行下面的异步函数。
async function migrateDocs() {
const oldColRef = db.collection("FIRST_COLLECTION")
const newColRef = db.collection("SECOND_COLLECTION")
const orderQuery = await oldColRef.where("status", "==", "ACTIVE").limit(500).get();
const addBatch = db.batch();
const delBatch = db.batch();
orderQuery.docs.forEach(doc => {
addBatch.set(newColRef.doc(doc.id), doc.data())
delBatch.delete(oldColRef.doc(doc.id))
})
// add docs in new collection
await addBatch.commit();
// remove same docs from old collection
await delbatch.commit();
console.log("500 docs migrated")
}
由于批处理写入只能包含500个操作,因此我们有.limit(500)
,因此我们只获取500个文档。你也可以读所有的文档,然后创建一批500个(这样你就不必一次又一次地手动运行相同的),或者单独运行所有的承诺(我更喜欢批量写)。
是否有更好的方法将文档从一个集合迁移到另一个集合另一个是Firestore?PS.我还想从集合
中删除文档
将文档从一个集合移动到另一个集合的唯一方法是您在问题中描述的方式,即模仿"复制"&paste"使用以下顺序:
在目标集合中创建源文档的副本,即从源集合中读取它,获取文档字段并在目标集合中使用这些字段创建新文档。
如果你想做一个">剪切,paste"(也从源集合中删除文档),您需要在完成复制/粘贴序列后从源集合中删除这些文档。
请注意,Firestore提供了使用托管导出和导入服务和云存储导出和导入文档的可能性,但是您不能从一个集合导出文档并在另一个集合中导入它们。