You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 15:40:37