javascript - 如何删除 Firebase 对象映射内的深度嵌套字段

标签 javascript firebase google-cloud-firestore

我有一个名为“CourseList”的 firebase 对象映射,其中包含嵌套字段。这些嵌套字段本身是包含进一步嵌套字段的对象映射。此外,其中一些对象贴图将具有随机生成的名称。

目标是删除随机生成的名称为“352oIP3fdc6IIvuBbajR0”(蓝色下划线)的对象映射。 “CourseList”和“LectureList”的名称是静态名称,但是红色 CourseID(随机生成的名称为“2dfPipFRKiB6TAKab4jv8”)。

enter image description here

通过关注 stackOverflow 上的其他问题,如果我想删除红色对象映射“2dfPipFRKiB6TAKab4jv8”,我就能够使删除功能正常工作。

let CID = '2dfPipFRKiB6TAKab4jv8';

await db.collection('users').doc(UID).set( { 
  CourseList : { [CID]: FieldValue.delete() }
    
},{ merge: true }
);

但是,当我尝试删除“352oIP3fdc6IIvuBbajR0”的蓝色下划线子对象贴图时,该操作似乎没有执行任何操作,并且 Firebase 文档没有变化。

let CID = "2dfPipFRKiB6TAKab4jv8";
let LID = "352oIP3fdc6IIvuBbajR0";

await db.collection('users').doc(UID).set( { 
  CourseList : { [`${CID}.LectureList.${LID}`]: FieldValue.delete() }

},{ merge: true }
    );

如果您能清楚地了解如何正确删除对象映射内的深层嵌套字段,我们将不胜感激。

最佳答案

虽然这篇文章很旧,以防有人以后发现这个

要使 DOT 路径起作用,您必须使用 update而不是set , set不处理 DOT 路径,甚至合并。合并将合并所有提供的嵌套对象,因此数据不会被破坏。

解决方案:

要使删除工作,您需要调用

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 ,路由至此处,如 update很清楚,但有助于澄清操作之间的差异

为什么其中一项删除有效:

@andrewB 您通过 CID 的删除有效,因为没有嵌套路径

下面的代码之所以有效,是因为它执行了以下操作:

let CID = '2dfPipFRKiB6TAKab4jv8';

await db.collection('users').doc(UID).set( { 
  CourseList : { [CID]: FieldValue.delete() }
},{ merge: true }
);
  1. 尝试更换 key CourseListusers/${UID{ [CID]: FieldValue.delete() }
  2. 因为merge: true ,替换与现有值相结合,最终只触及键 [CID]而不是粉碎整个物体

关于javascript - 如何删除 Firebase 对象映射内的深度嵌套字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64654262/

相关文章:

Android Firebase DataSnapshot 类向自定义 java 对象返回 null

ios - 在两个 iOS 应用程序之间共享 Firebase 身份验证/ token

java - 使用 Dataflow 和 Java 删除 Firestore 集合

javascript - Stripe连接传输: Insufficient funds

javascript - 如何使用 PrototypeJS 检查一个元素是否在另一个元素之后?

javascript - 我该如何做类似 "if (a > x > b)"的事情?

javascript - jquery如何控制浏览器选项卡变化

javascript - 使用从 W3C 地理定位返回的位置

Firebase(Vue)通过(多个)子值获取

firebase - Stream <QuerySnapshot>返回空文档