【问题标题】:Remove item by key/value from Firestore array从 Firestore 数组中按键/值删除项目
【发布时间】: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
        )
    })
    // ...
}

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

【问题讨论】:

    标签: javascript arrays reactjs firebase google-cloud-firestore


    【解决方案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)
        
        }
        

        【讨论】:

          猜你喜欢
          • 2012-02-11
          • 1970-01-01
          • 2021-08-14
          • 2021-04-03
          • 1970-01-01
          • 2020-10-19
          • 2011-04-26
          • 2018-04-07
          相关资源
          最近更新 更多