从 Firestore 数组中按键/值删除项目

IT技术 javascript arrays reactjs firebase google-cloud-firestore
2021-04-29 18:34:19

我在 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
        )
    })
    // ...
}

这些都没有这样做。我在这里错过了什么?

3个回答

您将无法使用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)

}
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')
    })
  }