从 Firestore 数组中按键/值删除项目
Posted
技术标签:
【中文标题】从 Firestore 数组中按键/值删除项目【英文标题】:Remove item by key/value from Firestore array 【发布时间】:2019-10-03 07:08:43 【问题描述】:我在 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
“Palette 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
)
)
// ...
这些都没有这样做。我在这里想念什么?
【问题讨论】:
【参考方案1】: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')
)
【讨论】:
【参考方案2】:您将无法使用FieldValue.arrayRemove
。这仅适用于作为数组的***字段。您也无法在一次操作中完成此操作。
你必须这样做
1) 将整个文档读入内存, 2) 以你想要的方式修改内存中的数组, 3)然后将字段更新回文档。
【讨论】:
【参考方案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)
【讨论】:
以上是关于从 Firestore 数组中按键/值删除项目的主要内容,如果未能解决你的问题,请参考以下文章