Firestore - 删除对象内的字段

Posted

技术标签:

【中文标题】Firestore - 删除对象内的字段【英文标题】:Firestore - Delete a field inside an object 【发布时间】:2018-06-17 04:13:34 【问题描述】:

我正在使用 Firestore,我想删除特定对象中的字段。 我可以删除文档中的字段,感谢:

fieldName: firebase.firestore.FieldValue.delete()

但是如果我有一个像这样的对象:

songList 
songName1: "HelloWorld",
songName2: "AnotherSong",
songName3: "andTheLastOne"

为了删除字段 songName3,我将无法执行以下操作:

songList.songName3: firebase.firestore.FieldValue.delete()

有没有办法删除对象内的字段?或者我应该删除整个对象,在没有第三个字段的情况下重建它并保存它?

提前致谢,

【问题讨论】:

这对我有用:***.com/a/47555348/5532513 【参考方案1】:

带有特殊“FieldValue.delete()”的“点符号”应该可以工作。

试试这个:

    Map<String, Object> deleteSong = new HashMap<>();
    deleteSong.put("songList.songName3", FieldValue.delete());

    FirebaseFirestore.getInstance()
        .collection("yourCollection")
        .document("yourDocument")
        .update(deleteSong);

它对我有用。

见:https://firebase.google.com/docs/firestore/manage-data/delete-data https://firebase.google.com/docs/firestore/manage-data/add-data

【讨论】:

【参考方案2】:

一般来说这对我有用

firebase
  .firestore()
  .collection('collection-name')
  .doc('doc-id')
  .set( songlist : 
    [songName]: firebase.firestore.FieldValue.delete()
  
  ,  merge: true );

【讨论】:

【参考方案3】:

今天发现了这个话题,想添加我的解决方案。我正在使用点符号。以下将使用firestore.FieldValue.delete(); 从歌曲列表中删除特定歌曲。我正在使用用 TypeScript 编写的 Node.js firebase-admin 包:

import * as admin from 'firebase-admin';
export async function removeSong(trackId: string, song: string) 
    try 
        const updates = ;
        // Dot Notation - will delete the specific song from songList
        updates[`songList.$song`] = admin.firestore.FieldValue.delete();
        // Not necessary, but it's always a good practice
        updates['updatedAt'] = admin.firestore.FieldValue.serverTimestamp();

        await firestore.collection('songs').doc(trackId).update(updates);
        return true
     catch (error) 
        return null;
    

【讨论】:

使用您的解决方案,我能够删除对象内的嵌套字段。但是,我使用了 firebase.firestore 而不是 admin.firestore。它似乎也能正常工作。【参考方案4】:

它不允许我在上面发表评论,但 Manuel Borja 的解决方案有效并且非常干净。这是我的使用方法:

db.collection("coolcollection")
  .doc(id)
  .set(
    
      users: 
        [firebase.auth().currentUser
          .email]: firebase.firestore.FieldValue.delete(),
      ,
    ,
     merge: true 
  );

要补充几点:当地图的给定字段存在和不存在时,这都有效。

【讨论】:

【参考方案5】:

我在使用 Kotlin 的 android 中遇到了同样的问题,我也用点表示法解决了这个问题。对于 Android Kotlin 用户,即:

 val songName: String = "songName3"
 val updatesMap = HashMap<String, Any>()
 updatesMap["songList.$songName"] = FieldValue.delete()
 FirebaseFirestore.getInstance()
                  .collection("Your Collection")
                  .document("Your Document")
                  .update(updatesMap)

希望这会有所帮助!

【讨论】:

【参考方案6】:

处理地图/对象的更简单方法

db.collection('Users').doc('key')
        .update(
            'products.keytext' : firebase.firestore.FieldValue.delete()
        )
        .then(() => 
            console.log('Success');
        )
        .catch((e) => 
            console.log('Error---->', e);
        );

这将从产品映射中删除带有键 keytext 的对象。

【讨论】:

【参考方案7】:

注意:这不适用于地图,仅适用于数组!

您也许可以将SongList 实现为数组而不是映射。因为对于数组,Firestore 现在有一个专门的函数来从数组中删除一个元素:

yourRef.update(
    songList: firebase.firestore.FieldValue.arrayRemove("SongName3")
);

来源:https://cloud.google.com/firestore/docs/manage-data/add-data#update_elements_in_an_array

【讨论】:

【参考方案8】:

使用 Map 更新文档,其中包含要删除的键和值 FieldValue.delete()

var collection = FirebaseFirestore.instance.collection('collection');
collection
  .doc('document_id')
  .update(
    
      'songList.songName3': FieldValue.delete(),
    
);

【讨论】:

【参考方案9】:
const deleteField = async () => 
    const FieldValue = firestore.FieldValue;
    const itemRef = firestore().collection('COLLECTION-NAME').doc('DOCUMENT-NAME');                                
    const res = await itemRef.update(
    'ELEMENT-NAME', FieldValue.delete() //'ELEMENT-NAME' OR Object.Field which equals to Parent Field Name.
);
e.g.
 
    12345:  you: 'You', me: 'Me', we: '12345' ,
    56789:  you: 'You', me: 'Me', we: '56789' ,

const res = await itemRef.update(
    object.we, FieldValue.delete() //OR '12345', FieldValue.delete()
);

【讨论】:

虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提出问题的人。请edit您的答案添加解释并说明适用的限制和假设。

以上是关于Firestore - 删除对象内的字段的主要内容,如果未能解决你的问题,请参考以下文章

Firestore删除一个数组内的索引

从 Firestore 中删除文档中的字段

如何更新firestore中数组内的对象? [复制]

无法从 Firestore 文档中删除字段 (Flutter)

使用nodejs从firestore文档中删除字段

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