簡體   English   中英

如何刪除 Firebase Object map 中的深層嵌套字段

[英]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而不是setset不處理 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 }
);
  1. 嘗試用{ [CID]: FieldValue.delete() }替換users/${UID中的關鍵CourseList
  2. 因為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM