我正在Firebase / firestore上开发一个Web应用程序,用户可以在其中登录并撰写自己的帖子。数据以以下方式存储:
-用户信息存储在collection('user')。doc('uid')下。
-有关用户撰写的帖子的信息存储在collection('post')。doc('postid')中,并且该文档具有'userinfo'和'uid'字段。 “ userinfo”字段包含对象格式的“ uid”文档中存储的内容的精确副本。
这是我要执行的操作:
当用户更改数据时,更改将反映在文档中。
根据“ uid”数据查找用户编写的所有帖子,然后在这些数据中更新userinfo。
最后一部分对我来说很棘手。 Firebase文档涵盖了引用几乎是静态的情况,即您知道写入/更新的确切路径。我想做的是寻找一组不一定是静态的文档,然后更新每个文档。
这是我为此编写的代码。第一部分工作正常。当然,第二部分不起作用。 :)做第二部分的代码是什么?
const update = () => {
//This part is for updating user information. This works without any problem.
firebase.firestore().collection('user').doc(user.uid).update({
username: username1,
nickname: nickname1,
intro: intro1
})
.then(()=>{
//This part is for updating all of the document that the user has written based on 'uid' value. This doesn't work.
//Below code is probably way off, but it shows where I am going and what I am trying to do.
firebase.firestore().collection('post').where('uid','==',user.uid).get()
.then((querysnapshot)=>{
querysnapshot.forEach((doc)=>{
let ref=firebase.firestore().collection('post').doc(doc.id);
ref.update({
userinfo: {nickname:nickname1,username:username1,intro:intro1}
})
})
})
}).then(()=>{
alert("Successfully updated!");
window.location.href='/'+username1;
}).catch((error)=>{
alert("Error!");
})
}
非常感谢!
答案 0 :(得分:1)
运行此代码有什么错误?对于我来说,这似乎是对的。
但是,尽管如此,这里还是一些应对这种更新的建议:
不要在客户端执行第二部分,而是在服务器端使用Firestore触发器(在您的情况下在用户集合中创建onUpdate触发器)来完成此操作:https://firebase.google.com/docs/functions/firestore-events。
获取查询结果后,无需重新创建DocumentReference,返回的文档已经具有一个.ref,您可以直接调用.ref.update()。
编辑:如果要保留原始代码(在客户端更新),则在所有更新结束之前进行导航的问题是因为ref.update()返回了promise。
因此,当客户端离开时,更新队列是在数据库上异步执行的。
要解决此问题,我将使用Promise.all()等待所有更新完成。
firebase.firestore().collection('post').where('uid','==',user.uid).get()
.then((querysnapshot)=>{
const promises = [];
querysnapshot.forEach((doc)=>{
promises.push(doc.ref.update({
userinfo: {nickname:nickname1,username:username1,intro:intro1}
});
});
Promise.all(promises).then(()=>{window.location.href='/'+username1;});
});
或者使用await语法(我认为这更易于维护和理解):
const querysnapshot = await firebase.firestore().collection('post').where('uid','==',user.uid).get();
const promises = [];
querysnapshot.forEach((doc)=>{
promises.push(doc.ref.update({
userinfo: {nickname:nickname1,username:username1,intro:intro1}
});
});
await Promise.all(promises);
window.location.href='/'+username1;