将来自POST请求的标签存储在Firebase中,用于Node.js中的不同集合



我有两个集合,poststagsposts包含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

相关内容

  • 没有找到相关文章

最新更新