首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Firebase实时数据库规则中将密钥解析为数字?

问如何在Firebase实时数据库规则中将密钥解析为数字?
EN

Stack Overflow用户
提问于 2022-08-13 11:37:08
回答 1查看 35关注 0票数 0

我使用unix时代时间戳作为键(防止对特定的秒进行双推,并按推送日期排序),和我希望阻止用户超过当前时间戳.。

代码语言:javascript
复制
"$timestamp": {
 ".write": "now/1000 - $timestamp > 0"
}

数据库: database.rules.json:XX:XX:无效-表达式:右操作数不是数字。

正如文档中所述,键总是字符串。,不能将数字与键进行比较(好吧,文档用一个奇怪的级联示例.?)假装不同。

有没有办法将密钥解析为实时数据库规则中的一个数字,以便我可以将其用于每个比较运算符?

注意:下面是我当前的解决方法,它意味着冗余数据:

代码语言:javascript
复制
"$timestamp": {
 ".write": "now/1000 - newData.child('typed_timestamp').val() > 0",
 "body":{},
 "typed_timestamp": {
".validate": "newData.isNumber() && newData.val()+'' == $timestamp"
}
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-13 13:03:22

文档显示了一个字符串连接示例,其中表达式的左侧为字符串,使用+运算符将数字$room_id追加到右侧:

代码语言:javascript
复制
".validate": "root.child('room_names/' + $room_id).exists()"

需要注意的是,左边的字符串确保字符串连接将发生,而不是数字数学。

您可以使用左边的空字符串和右边的数字,从数字创建字符串:

代码语言:javascript
复制
'' + (now/1000)

另外,我要说的是,在实时数据库中,使用数字作为密钥并不是一个好主意。当使用数字作为键时,RTDB可能会将它们解释为数组索引,这意味着您的查询最终将生成数组而不是映射。这就是为什么数据库更喜欢使用字符串推送ID的原因之一。(此外,推送ID更有可能是真正独特的。)首选使用时间戳号值作为子值,然后在规则中使用该子值限制基于时间戳的写入。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73343905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档