[英]How to delete a deeply nested field inside a Firebase Object map
我有一個名為“CourseList”的 firebase Object map,其中包含嵌套字段。 這些嵌套字段本身是 Object 映射,其中包含更多嵌套字段。 此外,其中一些 object 地圖將具有隨機生成的名稱。
目標是刪除隨機生成的名稱為“352oIP3fdc6IIvuBbajR0”(藍色下划線)的 Object map。 “CourseList”和“LectureList”的名稱是 static 名稱,但是是紅色的 CourseID(具有隨機生成的名稱“2dfPipFRKiB6TAKab4jv8”)。
通過關注 stackOverflow 上的其他問題,如果我想刪除紅色 object map“2dfPipFRKiB6TAKab4jv8”,我能夠使用刪除功能。
let CID = '2dfPipFRKiB6TAKab4jv8';
await db.collection('users').doc(UID).set( {
CourseList : { [CID]: FieldValue.delete() }
},{ merge: true }
);
但是,當我嘗試刪除“352oIP3fdc6IIvuBbajR0”的藍色下划線子對象map時,操作似乎沒有做任何事情,Firebase文件沒有變化。
let CID = "2dfPipFRKiB6TAKab4jv8";
let LID = "352oIP3fdc6IIvuBbajR0";
await db.collection('users').doc(UID).set( {
CourseList : { [`${CID}.LectureList.${LID}`]: FieldValue.delete() }
},{ merge: true }
);
任何關於如何正確刪除 object map 中的深層嵌套字段的任何清晰度將不勝感激。
雖然帖子很舊,以防萬一有人以后發現這個
對於 DOT 路徑,您必須使用update
而不是set
, set
不處理 DOT 路徑,甚至合並。 Merge 將合並所有提供的嵌套 object,因此數據不會被破壞。
解決方案:
為了刪除工作,你需要打電話
let CID = "2dfPipFRKiB6TAKab4jv8";
let LID = "352oIP3fdc6IIvuBbajR0";
await db.collection('users').doc(UID).update( {
[`CourseList.${CID}.LectureList.${LID}`]: FieldValue.delete()
} )
如何使用 SET+MERGE 做同樣的事情:
同樣要與set + merge:true
一起使用,它必須是
let CID = "2dfPipFRKiB6TAKab4jv8";
let LID = "352oIP3fdc6IIvuBbajR0";
await db.collection('users').doc(UID).set({
'CourseList': {
[CID]: {
'LectureList': {
[LID]: {
FieldValue.delete()
}
}
}
},
{ merge: true }
);
沒有理由在這里做set
, route ,因為update
很清楚,但它有助於澄清與他操作的區別
為什么其中一個刪除有效:
@andrewB 你通過 CID 刪除是有效的,因為沒有嵌套路徑
以下代碼之所以有效,是因為它執行了以下操作:
let CID = '2dfPipFRKiB6TAKab4jv8';
await db.collection('users').doc(UID).set( {
CourseList : { [CID]: FieldValue.delete() }
},{ merge: true }
);
{ [CID]: FieldValue.delete() }
替換users/${UID
中的關鍵CourseList
merge: true
,替換與那里的現有值結合,最終只觸及鍵[CID]
而不是粉碎整個 object您需要指定嵌套值的完整路徑作為傳遞給set()
的對象的鍵。 您不能像現在這樣將其表示為一系列嵌套對象。
await db.collection('users').doc(UID).set({
[`CourseList.${CID}`]: FieldValue.delete()
},
{ merge: true }
);
解決方案:
對於未來的讀者,這是我用來刪除對象映射中高度嵌套的字段的代碼。
const userRec = db.collection('users').doc(UID);
let userRecData = await userRec.get();
let userRecResp = {};
userRecResp = userRecData.data();
delete userRecResp.CourseList[CID]['LectureList'][LID];
await db.collection('users').doc(UID).update(userRecResp);
請注意,“UID”、“CID”和“LID”是變量名。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.