我有一个名为“CourseList”的 firebase 对象映射,其中包含嵌套字段。这些嵌套字段本身是包含进一步嵌套字段的对象映射。此外,其中一些对象贴图将具有随机生成的名称。
目标是删除随机生成的名称为“352oIP3fdc6IIvuBbajR0”(蓝色下划线)的对象映射。 “CourseList”和“LectureList”的名称是静态名称,但是红色 CourseID(随机生成的名称为“2dfPipFRKiB6TAKab4jv8”)。
通过关注 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 }
);
- 尝试更换 key
CourseList
在users/${UID
与{ [CID]: FieldValue.delete() }
- 因为
merge: true
,替换与现有值相结合,最终只触及键[CID]
而不是粉碎整个物体
关于javascript - 如何删除 Firebase 对象映射内的深度嵌套字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64654262/