我有两个集合,posts
和tags
。posts
包含postId
和包括tags
在内的其他元数据。这就是post
的样子:
{
"tags": [
"tag1",
"tag2",
...
],
"message": "test message"
...
}
这将返回上面的帖子,并带有postId
。
使用Axios,我可以在功能中接收这些数据。我想取下每个标签,将它们与相关的postId
一起放在tags
集合中。
tags
集合的示例:
tags: {
tag1: {
"postId1",
"postId2"
},
tag2: {
"postId1",
"postId3"
}
}
我一直在Firebase中将标签添加到它自己的集合中,我也尝试过使用forEach
标签并逐一更新tags
集合,但这对我来说不起作用
我目前拥有的代码:
db.collection("posts")
.add(oneNewPost)
.then((doc) => {
// add the post body to the "posts" collection
const resPost = oneNewPost;
resPost.postId = doc.id;
res.json(resPost);
})
.then(() => {
// DOESNT WORK HERE --> overwrites changes in firebase "tags" collection
let batch = db.batch();
resPost.tags.forEach((doc) => {
const docRef = db.collection("tags").doc(doc);
batch.update(docRef, { postId: resPost.postId }, { merge: true });
});
batch.commit().then(() => {
return res.json({...resPost});
});
})
.catch((err) => {
res.status(500).json({ error: "something went wrong" });
console.error(err);
});
如果有什么不清楚的地方,请告诉我!
我使用以下代码使其工作:
.then((resPost) => {
// add postId's to tag collection here
let batch = db.batch();
resPost.tags.forEach((doc) => {
const docRef = db.doc(`/tags/${doc}`);
batch.update(
docRef,
{ postId: admin.firestore.FieldValue.arrayUnion(resPost.postId) },
{ merge: true }
);
});
batch
.commit()
.then(() => {
return res.json({ ...resPost });
})
.catch((err) => {
console.error(err);
return res.status(500).json({ error: err.code });
});
})
基本上,您需要进行批量更新,但也需要为每个postId
执行特定的FieldlValue
。