firebase 允许用户将数据存储到firestore中,而无需使用reactjs覆盖以前的数据

q5iwbnjs  于 2022-11-17  发布在  React
关注(0)|答案(2)|浏览(167)

我正在做一个允许登录用户向firestore firebase报告他们丢失的物品的东西。现在我所做的是成功地将用户报告的细节注册到'reports'集合中。
但是每次同一个用户报告另一个项目时,以前报告的项目的详细信息就会被覆盖。我希望它以这样一种方式被添加到同一个集合中,而不会覆盖以前的项目。就像在数组中,当你添加一个项目时,它不会被覆盖,而是添加到数组中
我已经做过了
第一个
我想要的是这个

{
  "posts": {
    "0": {
      "author": "gracehop",
      "title": "Announcing COBOL, a New Programming Language"
    },
    "1": {
      "author": "alanisawesome",
      "title": "The Turing Machine"
    }
  }
}

有人能帮我做这个吗?

cunj1qz1

cunj1qz11#

调用setDoc()而不调用merge: true将覆盖文档。您还将传递用户id作为以这种方式编写的文档id。请尝试调用addDoc(),并在获得下载URL后使用update。其中一些操作还可以稍微清理异步语句:

const newDoc = doc(collection(db,"reports", auth.currentUser.uid));

await addDoc(newDoc, {}).then(() => {
 if (image) {
  const storageRef = ref(storage, `images/${image.name + auth.currentUser.uid}`)
  const uploadTask = uploadBytesResumable(storageRef, image);
   setimage(null);
   uploadTask.on(
    'state_changed',
    null,
    (err) => console.log(err),
     async () => {
      const url = await getDownloadURL(uploadTask.snapshot.ref)
       console.log(url)
       await updateDoc(newDoc, { imgurl: url });
    });
  } else {
    console.log(newDoc)
  }
});

如果您不希望按用户ID保存每个报表,而只是让报表集合成为记录数组,则应删除用户ID部分。

const newDoc = doc(collection(db,"reports"));

// this will still work because the auto-generated ID is returned to the update method
t9aqgxwy

t9aqgxwy2#

假设目标是在reports/user.id/中添加新帖子而不覆盖现有帖子,请尝试以下方法:
1.首先在reports/user.id下为新帖子创建一个引用,并使用自动生成的ID,这将是newPostRef
1.使用newPostRef设置报告内容
1.上传图像并获取下载网址(与原始网址相同)
1.再次使用newPostRef更新包含下载URL的帖子,使用{ merge: true }
示例:

import { collection, doc, setDoc } from "firebase/firestore";

const newPostRef = doc(collection(db, "reports", auth.currentUser.uid));

await setDoc(newPostRef, {
  description: descref.current.value,
  email: auth.currentUser.email,
  timestamp: serverTimestamp(),
}).then(async () => {
  if (image) {
    const storageRef = ref(storage, `images/${image.name + newPostRef.id}`);
    const uploadTask = uploadBytesResumable(storageRef, image);
    setimage(null);
    uploadTask.on(
      "state_changed",
      null,
      (err) => console.log(err),
      () => {
        // download url
        getDownloadURL(uploadTask.snapshot.ref).then(async (url) => {
          console.log(url);

          //adding the image URL to collection
          await setDoc(newPostRef, { imgurl: url }, { merge: true });
        });
      }
    );
  }
});

reports/user.id将是一个接受多个带有自动ID的帖子的集合,希望这是这里想要的结果。

相关问题