【问题标题】:push data to array in Firebase将数据推送到 Firebase 中的数组
【发布时间】:2021-05-29 14:02:19
【问题描述】:

有谁知道如何在不覆盖的情况下将数据推送到 firebase 中的数组? 我使用这个解决方案,但不幸的是它覆盖了现有数据:

    db.collection('Goals').doc('Aqd8aP8uLSvuAgsMs5aW').update({"nested": ['12','14']})

【问题讨论】:

    标签: javascript reactjs firebase google-cloud-firestore


    【解决方案1】:

    如果数组中的项是唯一的,可以use array union:

    db.collection('Goals').doc('Aqd8aP8uLSvuAgsMs5aW')
      .update({"nested": firebase.firestore.FieldValue.arrayUnion(['12','14'])})
    

    如果数组中的项目不是唯一的,则无法使用单个语句来执行此操作,您需要:

    1. 阅读文档以获取数组的当前值。
    2. 将新值添加到应用程序代码中的数组中。
    3. 将整个回写到文档中。

    另见:

    【讨论】:

      【解决方案2】:

      根据文档https://firebase.google.com/docs/firestore/manage-data/add-data 你应该合并数据:

      如果文档不存在,则会创建它。如果文档确实存在,其内容将被新提供的数据覆盖,除非您指定数据应合并到现有文档中,如下所示:

        db.collection('Goals').doc('Aqd8aP8uLSvuAgsMs5aW').set({"nested": ['12','14']}, { merge: true });
      
      

      【讨论】:

        【解决方案3】:

        您可以使用以下语法来解决查询

        const handleOnSubmit = () =>{
            const dataRef = db.database().ref(user['']); 
            const data = ({
              *//data to push after every submit*
        
            });
            dataRef.push(data)
        }
        

        【讨论】:

          【解决方案4】:

          这可能不是最佳解决方案,但您可以获取当前数组并添加新元素。

              const { nested } = await db.collection('Goals').doc('id');
          
              nested.push('new element');
          
              await db.collection('Goals').doc('id').update( { nested } );
          

          【讨论】: