如何在Firestore规则中设置文档更新至少间隔一天?
问题
客户端创建包含timestamp的users文档代码:
db.collection('users') .doc(userId) .set({ ..... timestamp: firebase.firestore.FieldValue.serverTimestamp(), })
更新文档代码:
db.collection('users') .doc(userId) .update({ ..... timestamp: firebase.firestore.FieldValue.serverTimestamp(), })
当前Firestore规则配置:
match /users/{userId}{ allow create: ....... allow update: if request.auth != null && request.auth.uid == userId && ( (request.resource.data.diff(resource.data).affectedKeys().hasOnly(['name', 'description', 'timestamp']) && (request.resource.data.name != resource.data.name || request.resource.data.description != resource.data.description) && request.resource.data.name is string && request.resource.data.name.matches(".*<.*") == false && request.resource.data.description is string && request.resource.data.description.matches(".*<.*") == false && request.resource.data.timestamp>resource.data.timestamp )
需要修改最后一行规则,不仅要求新timestamp大于旧值,还要两者间隔至少一天,限制用户频繁编辑文档。
解决方案
Firestore的Timestamp类型支持toMillis()方法转换为毫秒数,通过计算新旧时间戳的毫秒差,即可判断是否间隔至少一天(1天=86400000毫秒)。
替换原规则中的时间判断条件,将request.resource.data.timestamp>resource.data.timestamp修改为:
request.resource.data.timestamp.toMillis() - resource.data.timestamp.toMillis() >= 86400000
完整的更新规则片段如下:
allow update: if request.auth != null && request.auth.uid == userId && ( (request.resource.data.diff(resource.data).affectedKeys().hasOnly(['name', 'description', 'timestamp']) && (request.resource.data.name != resource.data.name || request.resource.data.description != resource.data.description) && request.resource.data.name is string && request.resource.data.name.matches(".*<.*") == false && request.resource.data.description is string && request.resource.data.description.matches(".*<.*") == false && request.resource.data.timestamp.toMillis() - resource.data.timestamp.toMillis() >= 86400000 )
说明
- 利用
toMillis()将时间戳转为毫秒数做差值计算,确保两次编辑间隔至少24小时 - 保留了原规则中对字段类型、可修改字段范围的限制,仅调整时间判断逻辑
- 该判断仅在文档已存在
timestamp字段时生效,不影响文档创建逻辑
内容的提问来源于stack exchange,提问作者sirss
相关产品推荐
相关产品推荐

