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 文档中的字段键的主要内容,如果未能解决你的问题,请参考以下文章

如何使用颤振删除 Firestore 文档中的字段

UITableView 行被删除后不会被删除

当我删除它们时,UISearchController 不会删除结果

从表中删除不会删除行

SQLALCHEMY 删除关联对象不会从父子节点中删除

CoreData 中的删除不会删除;重新启动后出现已删除的对象