Firestore - удаление поля внутри объекта

Я использую Firestore, и я хотел бы удалить поле, которое находится в определенном объекте. Я могу удалить поле в документе благодаря:

fieldName: firebase.firestore.FieldValue.delete()

Но если у меня есть объект вроде:

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

Чтобы удалить поле songName3, я не смогу сделать что-то вроде:

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

Есть ли способ удалить поле внутри объекта? Или я должен удалить весь объект, перестроить его без третьего поля и сохранить его?

Заранее спасибо,

Ответы

Ответ 1

Просто обновите документ со значением объекта, который вы хотите его содержать. Не нужно сначала удалять, а затем обновлять.

Ответ 2

"Точечная нотация" со специальным "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.

Ответ 3

Нашел эту тему сегодня и хочу добавить свое решение. Я использую точечную запись. Следующее удалит конкретную песню из списка песен с помощью firestore.FieldValue.delete(); , Я использую пакет Node.js firebase-admin, написанный на TypeScript:

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 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

У меня была та же проблема с Android с использованием Kotlin, и я решил ее с помощью точечной нотации. Для пользователей 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)

Надеюсь, это поможет!

Ответ 5

Эта работа для меня в целом

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

Ответ 6

Внимание: это не работает для Карт, только для Массивов!

Возможно, вы сможете реализовать 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