因此,我在Firestore有2個集合,
我有2個集合。
- 用戶(集合)
- Inspection(集合)
用戶只有以不同電子郵件地址命名的檔案 檢查有以不同的電子郵件地址命名的檔案,然后每個檔案有另一個名為 "assignedToMe "的集合,然后這個集合有以一些獨特的ID命名的不同檔案。
我想做的是,每當我洗掉一個用戶時,我希望其名為他的電子郵件地址的檔案也從Inspection(集合)中被洗掉。
我遇到的問題是,我能夠從Users(collection)中洗掉用戶,但無法在Inspection(collection)中洗掉該用戶的檔案,下面是我的代碼和Firestore的結構。
router. use("/delete", [auth, admin], async function (req, res, next) {
const { email } = req.body;
const userRef = db.collection("Users").doc(email)。
const insRef = db.collection("Inspection").doc(email)。
const user = await userRef.get()。
const inspection = await insRef.get()。
if (!user.exists) {
return res.status(404).send("此用戶已被洗掉!") 。
} else {
const result = userRef.delete();
if (!inspection.empty) {
const myres = insRef.delete()。
}
result && res.status(200).send("用戶洗掉成功。") 。
}
});
uj5u.com熱心網友回復:
Inspection檔案在控制臺中顯示為斜體字:這意味著這些檔案只是作為assignedToMe子集的 "容器 "存在,但它們不是 "真正的 "檔案。更多資訊請參見此答案。
此外,洗掉一個檔案并不會洗掉其子集合中的檔案,這在鏈接的答案中也有解釋。你必須同時洗掉子集合中的檔案。
更具體地說,在你的案例中,你需要在assignedToMe子集上回圈,以便洗掉它所包含的所有檔案。您可以在一個Batch Write中分組所有的delete()操作,如下所示:
路由器。 use('/delete', [auth, admin], async function(req, res, next) {
try {
const { email } = req.body;
const userRef = db.collection('Users').doc(email)。
const user = await userRef.get()。
if (!user.exists) {
return res.status(404).send('此用戶已被洗掉!' )。
} else {
const batch = db.batch() 。
//洗掉用戶檔案。
batch.delete(userRef)。
//洗掉 assignedToMe子集檔案
const assignedToMeRef = db
.collection('Inspection'/span>)
.doc(email)
.collection('assignedToMe')。
const assignedToMeQuerySnapshot = await assignedToMeRef.get()。
assignedToMeQuerySnapshot.forEach((doc) =>; {
batch.delete(doc.ref)。
});
//注意,如果assignedToMe子集是空的,那么
///沒有什么會被添加到前一個回圈的分批寫入中。
await batch.commit()。
result && res.status(200).send('用戶洗掉成功。')。
}
} catch(錯誤) {
console.log(錯誤)。
return res
.status(500)
.send('The following error occured: ' JSON.stringify(error))。
}
});
注意,一個分批寫操作最多可以包含500個操作。如果你打算讓assignedToMe子集合包含超過499個檔案(分批寫入也會洗掉用戶檔案),你需要使用Promise.all()。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/325746.html
標籤:


