从Firestore阵列中按键/值删除项目

时间:2019-05-16 05:08:51

标签: 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]

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

这些都没有做。我在这里想念什么?

3 个答案:

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