Firestore - 删除对象内的字段

时间:2018-01-08 07:33:57

标签: firebase google-cloud-firestore

我正在使用Firestore,我想删除特定对象中的字段。 我可以删除文档中的字段,这要归功于:

fieldName: firebase.firestore.FieldValue.delete()

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

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

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

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

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

提前致谢,

10 个答案:

答案 0 :(得分:13)

带有特殊“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

答案 1 :(得分:3)

这对我来说总体来说是

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

答案 2 :(得分:3)

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

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

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

答案 3 :(得分:2)

今天找到了这个主题,并希望添加我的解决方案。我正在使用点符号。下面将使用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;
    }
}

答案 4 :(得分:2)

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

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

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

答案 5 :(得分:0)

警告:这不适用于地图,仅适用于数组!

您也许可以将SongList实现为数组而不是Map。因为对于数组,Firestore现在具有专用功能来从数组中删除元素:

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

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

答案 6 :(得分:0)

我在使用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)

希望这会有所帮助!

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

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

答案 9 :(得分:-2)

只需使用您希望包含的对象的值更新文档。无需先删除然后更新。