首页 > 解决方案 > 如何保存多条消息并将其保存在 Firestore 的单独字段中?

问题描述

这是某个用户的firestore文档:

在此处输入图像描述

这就是我将如何保存要保存在 Firestore 中的消息:

  const [msg, setMsg] = useState("");

  const handleSubmit = (e) => {
    e.preventDefault();
    try {
      const userRef = firestore.collection("users").doc(uid);
      const ref = userRef.set(
        {
          msg,
        },
        { merge: true }
      );
      console.log(" saved");
    } catch (err) {
      console.log(err);
    }
  };

  return (
    <div>
        <form onSubmit={handleSubmit}>
          <TextField
            value={msg}
            onChange={(e) => setMsg(e.target.value)}
          />
          <Button type="submit">
            Submit
          </Button>
        </form>
    </div>
  );
};

这样,我可以将消息保存在 firestore 中,但是,如果我要发送另一条消息,它将替换保存在其中的上一条消息。如何在 Firestore 中保存一条消息并保存另一条消息而不影响上一条消息?

标签: javascriptreactjsfirebasegoogle-cloud-firestore

解决方案


我了解您正在覆盖users集合中的同一文档。这可能是(我们看不到整个代码),因为您没有更改uid两次写入之间的值。uid作为文档 ID,它会被覆盖(即使您使用该{ merge: true }选项,如果msg对象包含现有字段,它们也会被覆盖)。

您提到您保存消息,所以我想您想为给定用户保存几条消息(该用户由 标识uid)。因此,您可以在用户的​​文档下有一个子集合,并让 Firestore 每次将文档添加到此集合时,使用该add()方法生成一个新的文档 ID。

大致如下:

const messagesCollection = firestore.collection("users").doc(uid).collection('messages');

const messagePayload = {foo: 'bar', bar: 'foo'};
messagesCollection.add({messagePayload});

推荐阅读