【问题标题】:FieldValue.delete() does not remove field key in firestore documentFieldValue.delete() 不会删除 firestore 文档中的字段键
【发布时间】: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 测试过
  • 我刚刚更新了问题,之前没有准确描述问题。

标签: javascript node.js firebase google-cloud-platform google-cloud-firestore


【解决方案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()
    })
    

    在键中使用点表示法允许您访问嵌套对象。

    【讨论】:

      猜你喜欢
      • 2021-09-28
      • 2018-04-09
      • 2020-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-31
      • 2019-11-25
      • 2021-09-29
      相关资源
      最近更新 更多