我正在建立一个论坛Appin Vue,基本上是该网站的一个克隆...用户可以发布问题,获取这些问题的答案以及对这些答案的评论。我有一个分别用于问题,答案和评论的顶级集合,这些集合中的每个文档都有一个名为的字段photoURL
,用于存储该问题/答案/评论作者的个人资料图片的网址。
现在,photoURL
当用户更新个人资料图像时,我具有以下代码来更新三个集合中同一作者的每个文档中的字段:
const QUESTIONS = db.collection("questions");
QUESTIONS.where("authorId", "==", this.user.data.id)
.get()
.then(snapshots => {
if (snapshots.size > 0) {
snapshots.forEach(questionItem => {
QUESTIONS.doc(questionItem.id).update({
photoURL: imgUrl
});
});
}
});
const ANSWERS = db.collection("answers");
ANSWERS.where("authorId", "==", this.user.data.id)
.get()
.then(snapshots => {
if (snapshots.size > 0) {
snapshots.forEach(answerItem => {
ANSWERS.doc(answerItem.id).update({
photoURL: imgUrl
});
});
}
});
const COMMENTS = db.collection("comments");
COMMENTS.where("authorId", "==", this.user.data.id)
.get()
.then(snapshots => {
if (snapshots.size > 0) {
snapshots.forEach(commentItem => {
COMMENTS.doc(commentItem.id).update({
photoURL: imgUrl
});
});
}
});
目前可以使用,但是有一种方法可以一次执行这三个操作?还是一般而言实现这些更新的更好方法?我当时在考虑将从三个集合中检索到的所有id首先存储在一个数组中,然后进行更新,但是写入次数将保持不变,因此看起来并没有改善。
我可以快速想到的两种方法:
您可以创建一个辅助函数,该函数将集合作为参数进行更新:
function updateDocumentsInCollectionForAuthor(collection, author, update) {
db.collection(collection).where("authorId", "==", author)
.get()
.then(snapshots => {
snapshots.forEach(doc => {
doc.ref.update(update);
});
});
}
正如Doug所说,您可以分批执行此操作,但性能差异可能不值得代码复杂度,如下所示:向Firestore写入大量文档的最快方法是什么?
然后,您可以调用它来更新每个集合:
updateDocumentsInCollectionForAuthor("questions", this.user.data.id, { photoURL: imgUrl });
updateDocumentsInCollectionForAuthor("answers", this.user.data.id, { photoURL: imgUrl });
updateDocumentsInCollectionForAuthor("comments", this.user.data.id, { photoURL: imgUrl });
替代方法是更改数据模型,以将所有问题,答案和评论存储在同一集合中。实际上,这就是Stack Overflow的作用:所有这些项目都在一个表中,并用一个值来分开,该值指示该发布的类型。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句