我在Firestore中有一个结构如下的数组:
palettes
0: {date: 2019-05-01, name: "First Palette", palette: [array]}
1: {date: 2019-05-02, name: "Palette 2", palette: [array]
palettes
数组中的每个项目都是一个调色板项目,在数组中具有日期,名称和调色板数据。
在我的React应用程序中,我试图通过引用其name
值并没有任何运气来删除Firestore数据库中的特定调色板。
例如,如果我从点击事件中传入了paletteName
“调色板2”,如何删除以该字符串作为名称值的调色板?
这是我尝试过的:
1。
const deletePalette = paletteName => {
db.collection('users').doc(user.uid)
.update({
palettes: firebase.firestore.FieldValue.arrayRemove({
name: paletteName
})
})
// ...
}
2。
const deletePalette = paletteName => {
db.collection('users').doc(user.uid)
.update({
palettes: firebase.firestore.FieldValue.arrayRemove(paletteName)
})
// ...
}
3。
const deletePalette = paletteName => {
const ref = db.collection('users').doc(`${user.uid}/palettes/`)
ref.update({
[paletteName]: firebase.firestore.FieldValue.delete()
})
// ...
}
4。
const deletePalette = paletteName => {
db.collection('users').doc(user.uid)
.update({
palettes: palettes.filter(
palette => palette.name !== paletteName
)
})
// ...
}
这些都没有做。我在这里想念什么?
答案 0 :(得分:2)
您将无法使用FieldValue.arrayRemove
。这仅适用于作为数组的顶级字段。您也将无法在单个操作中完成此操作。
您将必须
1)将整个文档读入内存,
2)以所需的方式修改内存中的数组,
3)然后将字段更新回文档。
答案 1 :(得分:0)
感谢@Doug的帮助。
最后很容易。我已经在我的应用程序状态下引用了该文档,因此从那里开始,我所需要的就是这个:
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)
}
答案 2 :(得分:0)
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')
})
}