从 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 数组中按键/值删除项目的主要内容,如果未能解决你的问题,请参考以下文章

Firebase Firestore:从文档数组中追加/删除项目

无法从数组中按键删除或取消设置特定的项目。

如何使用 SwiftUI 将值数组写入 Firestore

如何在 firestore 中的现有数组中添加或删除项目?

Firestore删除一个数组内的索引

Firestore - 如何从值映射中添加/减去