【问题标题】:Firestore - Delete a field inside an objectFirestore - 删除对象内的字段
【发布时间】: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()

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

提前致谢,

【问题讨论】:

标签: firebase google-cloud-firestore


【解决方案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您的答案添加解释并说明适用的限制和假设。
                猜你喜欢
                • 2019-02-22
                • 1970-01-01
                • 2019-06-23
                • 1970-01-01
                • 1970-01-01
                • 2018-04-09
                • 2021-11-21
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多