微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在reactjs中仅更新Firestore子集合中的一个文档ID

如何解决在reactjs中仅更新Firestore子集合中的一个文档ID

是否有可能仅更新firestore子集合中的一个文档ID,我一直在寻找解决方案,但我能找到的只是查询所有文档。如果我使用querySnapshot.foreach()子集合中具有相同字段值的所有文档都将更新。使用.where()还会查询所有文档,而不是特定的ID,但是我只是尝试更新一个。我正在尝试使用文档ID,但无法弄清楚如何为子集合调用ID。有办法吗?

const currentUser=firebase.auth().currentUser;
const userPost= firebase.firestore().collection('users') 
                .doc(currentUser.uid).collection("post");

const EditPost = async (event) => {
 event.preventDefault();

 await userPost
  .doc() <-- here I've been trying to put the subcollection doc id 
  .set({
    title: title,body: body,updatedAt: date,},{ merge: true })
  .catch((err) => {
    console.log(err)
  })
 }

这是firestore子集合结构

enter image description here

subcollection structure

的示例屏幕截图。目前,我尝试使用uuidv4,以便在添加新文档时也可以创建postId的字段值,因为我打算仅将postId作为文档ID进行调用,但它也位于子集合文档中。

解决方法

我终于弄清楚了如何为子集合中的单个文档调用文档ID并仅编辑特定文档的字段。可能不是最好的解决方案,但我将与那些有类似问题的人分享一下。

我的postlist.js中有一个查询的帖子列表,每个帖子都有一个唯一的键,该键等于子集合中的文档ID。

post 1 - edit
post 2 - edit
post 3 - edit

然后在我的路线上,我使用react路由器使用了useParams id。使用链接我转到发布者页面PostEditor.js。

<Route path="/posteditor/:id" component={PostEditor} />

通过使用PostEditor.js内部useParams中的ID,我现在可以在EditPost函数的.doc()内部分配ID。

const PostEditor = () => {
  const { id } = useParams

  const userPosts = ....;

  const EditPost = async (event) => {
    event.preventDefault();

    await userPosts
     .doc(id) <------*here I used the id from useParams*
     .set({
       title: title,body: body,updatedAt: date,},{ merge: true })
     .catch((err) => {
      console.log(err)
     })
  }

  return ( //// )
}

现在,我可以编辑一个文档,并在子集合内分别管理每个文档。正如我说的那样,这可能不是最好的解决方案,但对我来说却没有错误。

,

您无需使用collectoin.set({}),也可以使用collection.update({})来更新特定的收集字段。

db.collection("cities").doc("DC").update({
    capital: true
})

我在这里提到代码。这是参考站点的Link

,

假设您知道users集合中文档的ID和userPosts集合中文档的ID,则可以如下更新最后一个文档:

const currentUser = firebase.auth().currentUser;
const userPosts = firebase.firestore().collection('users') 
                .doc(currentUser.uid).collection("userPosts");  // <= note the change here,from collection("post") to collection("userPosts")
 
const userPostId = "8ea3....";

const EditPost = async (event) => {
 event.preventDefault();

 await userPosts
  .doc(userPostId) 
  .set({
    title: title,{ merge: true })
  .catch((err) => {
    console.log(err)
  })
 }

通常,要为您知道路径的文档创建DocumentReference,则需要交替调用collection()doc()方法。

您也可以使用斜线分隔的文档路径调用doc()方法,如下所示。请注意,由于指向文档,所以用斜杠分隔的路径包含偶数个元素。

const currentUser = firebase.auth().currentUser;
const userPostId = "8ea3....";

const userPostRef = firebase.firestore().doc(`users/${currentUser}/userPosts/${userPostId}`)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。