FieldValue.delete() 不会删除 firestore 文档中的字段键
Posted
技术标签:
【中文标题】FieldValue.delete() 不会删除 firestore 文档中的字段键【英文标题】:FieldValue.delete() does not remove field key in firestore document 【发布时间】:2018-07-28 01:41:49 【问题描述】:我正在使用 FieldValue.delete() 从 firestore 文档内的地图中删除字段,但密钥仍在地图上。我想删除键,而不仅仅是设置一个空对象作为值。
// Get the FieldValue object
var FieldValue = require('firebase-admin').firestore.FieldValue;
// Create a document reference
var exampleDocRef = db.collection('myDocumentType').doc('exampleDoc');
// Remove the key value pair from the map
var removeKeyValuePairInMap = exampleDocRef.update(
myMap: myKey:FieldValue.delete()
);
【问题讨论】:
请提供一些示例代码,包括 FieldValue.delete() 行和获取 FieldValue 对象的行 刚刚更新帖子 我刚刚创建了一个文档/cities/BJ
,其中包含 2 个字段(其中一个为 capital
),运行了您的代码,capital
字段从控制台中消失了。你有什么问题?你运行的是什么版本的firebase-admin
?我用 5.9.0 测试过
我刚刚更新了问题,之前没有准确描述问题。
这对我有用:***.com/a/47555348/5532513
【参考方案1】:
删除键/值对的一种方法是在 exampleDocRef 上运行 get(),然后像删除任何常规对象的键/值对一样删除它,然后在删除后更新文档。
exampleDocRef.get().then(doc =>
const data = doc.data().myMap //gets it into something you can traverse
with dot notation
delete data[myKey]; //deletes key/value pair
exampleDocRef.update( myMap: data) //now just updating myMap with
itself minus the key/value pair you deleted
);
好的,对我之前的回答进行编辑,这是使用变量的更好方法:
exampleDocRef.update(
myMap.myKey: FieldValue.delete()
)
您只需确保使用点符号遍历到要删除的键并调用 delete() 方法。这会从对象中删除键和值。
【讨论】:
这会使您面临覆盖地图其他更新的风险,并且您添加了对数据库的额外调用。 你说得对,蒂姆。第一种方式是一种hacky方式。我已经修改了答案。 这个 myMap.myKey: FieldValue.delete() - 应该是 [`myMap`.$mykey] : FieldValue.delete()。对象中的点表示法会产生错误。【参考方案2】:我遇到了同样的问题。就我而言,我用于对象键的变量实际上并未使用。但不知何故,仍然提取了来自该变量的数据。老实说,我什至不确定发生了什么。但这对我有用。
要将变量用作对象内的键,只需使用方括号即可。
// Firestore document
exampleDoc =
id001: someData,
id002: someOtherData,
id003: someOtherOtherData,
// Get the FieldValue object
var FieldValue = require('firebase-admin').firestore.FieldValue;
// Create a document reference
var exampleDocRef = db.collection('myDocumentType').doc('exampleDoc');
// Create a variable to use as object key for the field u want to delete
var fieldToDelete = 'id001'
// Remove field from firestore (key & value)
var removeKeyValuePairInMap = exampleDocRef.update(
[fieldToDelete]: FieldValue.delete()
);
【讨论】:
【参考方案3】:这是您在客户端/浏览器中的操作方式
firebase.firestore().collection('yourCollection').doc('docID').update(
"objOne.ObjTwoIfItExists": firebase.firestore.FieldValue.delete()
)
这就是您在云功能中的做法
firebase.firestore().collection('yourCollection').doc('docID').update(
"objOne.ObjTwoIfItExists": admin.firestore.FieldValue.delete()
)
在键中使用点表示法允许您访问嵌套对象。
【讨论】:
以上是关于FieldValue.delete() 不会删除 firestore 文档中的字段键的主要内容,如果未能解决你的问题,请参考以下文章