如何通过本机反应将新字段数据更新到现有文档而不覆盖firebase-9中的现有数据

Posted

技术标签:

【中文标题】如何通过本机反应将新字段数据更新到现有文档而不覆盖firebase-9中的现有数据【英文标题】:How can update new Field data to existing document without overwrite to existing data in firebase-9 by react native 【发布时间】:2022-01-08 10:02:06 【问题描述】:

我尝试通过 react native expo 将新字段添加到 firestore 中的现有数据中来更新数据 当我尝试通过 setDoc() 进行更新时,所有现有数据都已删除,并且仅新更新了一个 remian 如何将数据更新到firebase中的同一文档中

有人可以指导我如何在不丢失 Firestore 中现有数据的情况下添加新字段。

这是我的 setDoc 尝试

const updateUser = async(key, value) => 
  await addDoc(doc(db,'users',user.uid),  [key]: value )
;

我尝试添加的是新字段。如何添加新字段 我也尝试如下

 const updateUser = async(key,value)=>
    const updateRef = doc(db, "users",value);
    await updateDoc(updateRef, 
      [key]: true
    );
   

这是我尝试添加的新字段

【问题讨论】:

来自***.com/questions/70144432/…:“当您调用addDoc时,Firestore会为您生成新文档的ID。如果您想自己指定ID,请改用setDoc。” @Mises:你的意思是在代码中将调用从addDoc 更改为setDoc 吗?这听起来像是 OP 自己应该做出的改变。 @FrankvanPuffelen 我写了一个总结,我改变了所以希望他知道他在代码中使用了错误的函数。 但这应该是一个答案,而不是对问题的编辑。 @FrankvanPuffelen 他正在写关于setDoc() func 的文章,只有在代码sn-p 中他有addDoc()。如果他在代码中有一个选项 merge: true ,我会指出他使用了错误的函数。 【参考方案1】:

您需要设置选项合并。

火力基地 9+

function updateData(collPath, data) 
    setDoc(doc(db, collPath, data.id), data,  merge: true)

火力基地 8-

function updateData(collPath, data) 
    db.collection(collPath).doc(data.id).set(data,  merge: true )

在这两个库中,您都可以使用函数 updateDoc() 或 v8 ...doc().update()

【讨论】:

【参考方案2】:

您可以从 firebase 库中导入 firestore

import firestore from '@react-native-firebase/firestore';

然后你就可以得到你需要的文档参考

const docRef = firestore().collection('Users').doc('ABC')

之后你可以通过update()方法更新你的文档

  docRef
  .update(
    age: 31,
  )
  .then(() => 
    console.log('User updated!');
  );

您可以在本文档 https://rnfirebase.io/firestore/usage 中找到有关 firestore 使用的详细信息

【讨论】:

以上是关于如何通过本机反应将新字段数据更新到现有文档而不覆盖firebase-9中的现有数据的主要内容,如果未能解决你的问题,请参考以下文章

添加具有特定ID的文档而不覆盖现有ID

使用 mongoose 通过 update 方法向 mongodb 中的现有文档添加新字段

使用 mongoose 通过 update 方法向 mongodb 中的现有文档添加新字段

使用本机反应将图像上传到 Firebase 存储

如何使用本机反应将时间戳值转换为特定时间格式?

合并表而不覆盖mysql phpmyadmin中的现有表