Firestore如何阻止已存在active=true记录的用户重复新增文档
问题背景
我的Firestore数据库结构如下所示:
文档使用动态ID,用户ID未放在路径中,而是存储在文档的user字段内,文档另外包含active布尔字段。需要实现:当指定用户已经存在active=true的记录时,阻止新增对应同用户的新条目。
实现方案
优先推荐使用Firestore安全规则做服务端强制校验,从根源避免非法写入:
方案1:Firestore安全规则(无并发问题,强制生效)
安全规则会在所有写入请求到达数据库时自动校验,规则示例如下:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { // 替换your_collection为你的实际集合名 match /your_collection/{docId} { allow create: if // 校验请求参数格式合法 request.resource.data.user is number && request.resource.data.active is bool && // 校验不存在同用户且active=true的已有记录 !exists( /databases/$(database)/documents/your_collection, where("user", "==", request.resource.data.user), where("active", "==", true) ); } } }
配置完成后,只要目标用户已经存在active=true的记录,新增请求会直接被拦截并返回权限错误。
方案2:客户端预校验(仅做前端提示用)
如果需要在用户操作时提前给出交互提示,可以在客户端先做查询校验,示例代码(Web端JavaScript)如下:
const db = getFirestore(); const targetUserId = 37870283; const collectionRef = db.collection('your_collection'); // 先查询是否存在符合条件的记录 const checkSnapshot = await collectionRef .where('user', '==', targetUserId) .where('active', '==', true) .limit(1) .get(); if (checkSnapshot.empty) { // 无记录,允许写入 await collectionRef.add({ user: targetUserId, active: true, // 其他业务字段 }); } else { // 已有记录,提示用户 console.log('该用户已有激活状态的记录,无法新增'); }
注意:该方案仅作为前端交互补充,不能替代安全规则。并发场景下可能出现多个请求同时通过查询校验、最终写入多条重复记录的问题。
内容的提问来源于stack exchange,提问作者Anton Bogomolov
相关产品推荐
相关产品推荐

