Ответ 1
Просто обновите документ со значением объекта, который вы хотите его содержать. Не нужно сначала удалять, а затем обновлять.
Я использую Firestore, и я хотел бы удалить поле, которое находится в определенном объекте. Я могу удалить поле в документе благодаря:
fieldName: firebase.firestore.FieldValue.delete()
Но если у меня есть объект вроде:
songList {
songName1: "HelloWorld",
songName2: "AnotherSong",
songName3: "andTheLastOne"
}
Чтобы удалить поле songName3, я не смогу сделать что-то вроде:
songList.songName3: firebase.firestore.FieldValue.delete()
Есть ли способ удалить поле внутри объекта? Или я должен удалить весь объект, перестроить его без третьего поля и сохранить его?
Заранее спасибо,
Просто обновите документ со значением объекта, который вы хотите его содержать. Не нужно сначала удалять, а затем обновлять.
"Точечная нотация" со специальным "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.
Нашел эту тему сегодня и хочу добавить свое решение. Я использую точечную запись. Следующее удалит конкретную песню из списка песен с помощью 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;
}
}
У меня была та же проблема с 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)
Надеюсь, это поможет!
Эта работа для меня в целом
firebase
.firestore()
.collection('collection-name')
.doc('doc-id')
.set({ songlist : {
[songName]: firebase.firestore.FieldValue.delete()
}
}, { merge: true });
Внимание: это не работает для Карт, только для Массивов!
Возможно, вы сможете реализовать 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