更新 firebase Doc 中的单个值

Updating a single value in firebase Doc

第一次使用 firebase,我正在创建一个博客,当我创建一个 post 时,我将其创建为:

  const postCollection = collection(database, "posts");

  const submitPost = async () => {
    await addDoc(postCollection, {
      title,
      body,
      comments: [],
      liked: false,
      user: { name: auth.currentUser.displayName, id: auth.currentUser.uid },
    });
  };

在每个 post 下面我都有一个评论部分,但我对添加评论有点困惑。

我试过这个:

const addComment = async (id) => {
    const targetPost = doc(database, "posts", id);
    await setDoc(targetPost, { ...targetPost, comments: [comment] });
  };

但是没有用。 提前致谢

如果 post 已经存在,那么您可以使用 updateDoc() 来更新该文档中的特定字段,而不是 setDoc(),后者将覆盖文档(如果存在)。由于 'comments' 是一个数组,您可以使用 arrayUnion() 将新评论推送到您的 post,如下所示:

import { doc, updateDoc, arrayUnion } from "firebase/firestore";

const addComment = async (id) => {
  const targetPost = doc(database, "posts", id);

  await updateDoc(targetPost, {
    comments: arrayUnion(comment)
  });
};

如果您需要更新特定评论,请不要那样做,那么您必须阅读整个 post 文档,手动更新评论数组,然后将整个评论数组写回:

import { doc, getDoc, updateDoc } from "firebase/firestore";

const addComment = async (id) => {
  const targetPost = doc(database, "posts", id);
  
  const snapshot = await getDoc(targetPost)

  await updateDoc(targetPost, {
    comments: [...snapshot.data().comments, comment]
  });
};

同时结帐:

要删除特定评论,如果您知道确切的 comment 对象,可以使用 arrayRemove()