从Firestore数组中通过键/值删除项

4

我在 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 db中特定的调色板,但没有成功。
例如,如果我从点击事件中传入了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个回答

3

您将无法使用FieldValue.arrayRemove。这仅适用于作为数组的顶级字段。您也无法在单个操作中执行此操作。

您需要:

1)将整个文档读入内存,
2)以您想要的方式在内存中修改数组,
3)然后将该字段更新回文档中。


2

感谢 @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)

}

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接