我需要從一個集合中獲取一組檔案并將這些檔案遷移到另一個集合中。
所以我創建了一個查詢來從第一個集合中獲取所有檔案:
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);
}
有沒有更好的方法使用 firebase 將檔案從一個集合遷移到另一個集合?謝謝你的幫助!
附注。當他遷移到另一個集合時,我也想從集合中洗掉檔案,我不想有重復
uj5u.com熱心網友回復:
您可以將它們推送到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 個批次(這樣您就不必手動一次又一次地運行相同的檔案),如上所示,或者單獨運行所有承諾(我更喜歡批量寫入)。
uj5u.com熱心網友回復:
是否有更好的方法使用 Firestore 將檔案從一個集合遷移到另一個集合?附注。我也想從集合中洗掉檔案
將檔案從一個集合移動到另一個集合的唯一方法是您在問題中描述的方式,即按照以下順序模仿“復制和粘貼”:
在目標集合中創建源檔案的副本,即從源集合中讀取它,獲取檔案欄位并使用這些欄位在目標集合中創建一個新檔案。
如果要進行“剪切和粘貼”(也從源集合中洗掉檔案),則需要在完成復制/粘貼序列后從源集合中洗掉這些檔案。
請注意,Firestore 提供了使用托管匯出和匯入服務和 Cloud Storage匯出和匯入檔案的可能性,但您不能從一個集合匯出檔案并將其匯入另一個集合。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/334741.html
標籤:javascript 打字稿 火力基地 谷歌云firestore
