J'ai un tableau dans Firestore qui est structuré comme ceci:
const deletePalette = paletteName => { db.collection('users').doc(user.uid) .update({ palettes: palettes.filter( palette => palette.name !== paletteName ) }) // ... }
Chaque élément du tableau palettes
est un élément de palette avec la date, le nom et le les données de la palette dans un tableau.
Dans mon application React, j'essaie de supprimer une palette spécifique dans la base de données Firestore en référençant sa valeur name
et sans avoir de chance.
Par exemple, si j'ai la paletteName
"Palette 2" transmise à partir d'un événement de clic, comment puis-je supprimer la palette avec cette chaîne comme valeur de nom?
Voici ce que j'ai essayé:
1.
const deletePalette = paletteName => { const ref = db.collection('users').doc(`${user.uid}/palettes/`) ref.update({ [paletteName]: firebase.firestore.FieldValue.delete() }) // ... }
2.
const deletePalette = paletteName => { db.collection('users').doc(user.uid) .update({ palettes: firebase.firestore.FieldValue.arrayRemove(paletteName) }) // ... }
3.
const deletePalette = paletteName => { db.collection('users').doc(user.uid) .update({ palettes: firebase.firestore.FieldValue.arrayRemove({ name: paletteName }) }) // ... }
4.
palettes 0: {date: 2019-05-01, name: "First Palette", palette: [array]} 1: {date: 2019-05-02, name: "Palette 2", palette: [array]
Aucun d'entre eux ne le fait. Qu'est-ce que j'oublie ici?
3 Réponses :
Vous ne pourrez pas utiliser FieldValue.arrayRemove
. Cela ne fonctionne que pour les champs de niveau supérieur qui sont des tableaux. Vous ne pourrez pas non plus faire cela en une seule opération.
Vous devrez
1) lire l'intégralité du document en mémoire,
2) modifiez le tableau en mémoire comme vous le souhaitez,
3) puis mettez à jour le champ vers le document.
Merci @Doug qui a aidé.
Ce fut assez facile à la fin. J'avais déjà une référence dans le document dans l'état de mon application, donc à partir de là, tout ce dont j'avais besoin était ceci:
const deletePalette = paletteName => { // currentUser was in my app state and contains the user `doc` data // so just grab the palettes const userPalettes = currentUser.palettes // filter the palettes array const newPalettes = userPalettes.filter( palette => palette.name !== paletteName ) // update the doc with the filtered palettes var userRef = db.collection('users').doc(user.uid) userRef.update({ palettes: newPalettes }) // update my state to reload user data setPaletteRemoved(true) }
Cart = (ID) => { const x = { pname:'masala', price:22, data:1596960784777 } this.db.doc(`${ID}`).update({ cart: firebase.firestore.FieldValue.arrayRemove(x) }).then(() => { console.log('posted') }) }