问题描述
是否有可能仅更新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子集合结构 的示例屏幕截图。目前,我尝试使用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}`)