问题描述
我正在开发一个社交网络 Web 应用程序,我已经建立了一个使用 firebase 和 node js 关注关注者的系统,因此我创建了一个集合用户,并在其中创建了两个关注者数组,我设法添加了它们 现在我想发出一个条件来检查用户是否已经进行了跟进而不是第二次将其添加到表中我如何访问表(以下,关注者)以验证用户是否在
exports.onFollow = (req,res) => {
const followDocument = db.doc(`/users/${req.body.email}`);
const followerDocument = db.doc(`/users/${req.user.email}`);
let followData;
let followerData;
followDocument
.get()
.then((doc) => {
if (doc.exists) {
followData = doc.data();
if ('req.user.email','in',followData.followers.docs) {
return res.status(200).json({
error: 'user already follow'
});
} else {
followData.followers.push(req.user.email);
return followDocument.update({
followers: followData.followers
});
}
}
})
.catch((err) => {
console.error(err);
res.status(500).json({
error: err.code
});
});
解决方法
听起来您希望 followers
是一个具有唯一值的数组,以便每个电子邮件地址只能出现一次。 Firestore 具有特殊的 arrayUnion
操作来向此类字段添加值。
来自 updating elements in an array 的文档:
如果您的文档包含数组字段,您可以使用 arrayUnion()
和 arrayRemove()
添加和删除元素。 arrayUnion()
向数组添加元素,但只添加不存在的元素。 arrayRemove()
删除每个给定元素的所有实例。
var washingtonRef = db.collection("cities").doc("DC");
// Atomically add a new region to the "regions" array field.
washingtonRef.update({
regions: admin.firestore.FieldValue.arrayUnion("greater_virginia")
});
// Atomically remove a region from the "regions" array field.
washingtonRef.update({
regions: admin.firestore.FieldValue.arrayRemove("east_coast")
});
我建议在您的用例中切换到使用 arrayUnion()
,因为它可以避免必须执行查询来检测电子邮件地址是否已在数组中。