FieldValue.delete()不会删除firestore文档中的字段键

时间:2018-02-17 06:49:00

标签: google-cloud-firestore

我正在使用FieldValue.delete()从火星文档中删除地图中的字段,但该键仍在地图上。我想删除密钥,而不只是将空对象设置为值。

    // 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()}
    });

2 个答案:

答案 0 :(得分:1)

我正面临与此相同的问题。就我而言,我用于对象键的变量实际上并未使用。但是仍然从那个变量中提取数据。老实说,我什至不知道发生了什么。但这对我有用。

要将变量用作对象内的键,只需使用方括号即可。

// 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()
});

答案 1 :(得分:0)

删除键/值对的一种方法是在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()方法即可。这将从对象中删除键和值。