Javascript 从Firestore数组中按键/值删除项
我在Firestore中有一个数组,其结构如下:Javascript 从Firestore数组中按键/值删除项,javascript,arrays,reactjs,firebase,google-cloud-firestore,Javascript,Arrays,Reactjs,Firebase,Google Cloud Firestore,我在Firestore中有一个数组,其结构如下: palettes 0: {date: 2019-05-01, name: "First Palette", palette: [array]} 1: {date: 2019-05-02, name: "Palette 2", palette: [array] 调色板数组中的每个项目都是一个调色板项目,其中包含日期、名称和数组中的调色板数据 在我的React应用程序中,我试图通过引用Firestore db中的名称值来删除它,但没
palettes
0: {date: 2019-05-01, name: "First Palette", palette: [array]}
1: {date: 2019-05-02, name: "Palette 2", palette: [array]
调色板
数组中的每个项目都是一个调色板项目,其中包含日期、名称和数组中的调色板数据
在我的React应用程序中,我试图通过引用Firestore db中的名称
值来删除它,但没有任何运气
例如,如果我从单击事件传递了paletteName
“Palette 2”,如何删除该字符串作为名称值的调色板
以下是我尝试过的:
一,
二,
三,
四,
这些都没有做到。我错过了什么 您将无法使用
FieldValue.arrayRemove
。这仅适用于作为数组的顶级字段。您也无法在一次操作中完成此操作
你必须
1) 将整个文档读入内存,2) 按所需方式修改内存中的数组,
3) 然后将该字段更新回文档
谢谢@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)
}
const deletePalette = paletteName => {
db.collection('users').doc(user.uid)
.update({
palettes: firebase.firestore.FieldValue.arrayRemove(paletteName)
})
// ...
}
const deletePalette = paletteName => {
const ref = db.collection('users').doc(`${user.uid}/palettes/`)
ref.update({
[paletteName]: firebase.firestore.FieldValue.delete()
})
// ...
}
const deletePalette = paletteName => {
db.collection('users').doc(user.uid)
.update({
palettes: palettes.filter(
palette => palette.name !== paletteName
)
})
// ...
}
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')
})
}