根据子数据前面的6位搜索firebase实时数据库,我想查询两个数字(日期)之间的数据

Posted

技术标签:

【中文标题】根据子数据前面的6位搜索firebase实时数据库,我想查询两个数字(日期)之间的数据【英文标题】:Search firebase realtime database base on 6 digit in front of the child data, i want to query data between two numbers (dates) 【发布时间】:2022-01-01 17:24:43 【问题描述】:

是否可以从实时数据库中搜索前 6 位数字的数据库,例如我搜索 211010,范围内/前面有 211010 的数据会显示为 211010XXXXXXX、211010XXXXXXX,我想查询数据在两个数字(日期)之间。

211010 是日期 2021-10-10

【问题讨论】:

【参考方案1】:

您可能很想使用如下所示的查询:

DatabaseReference db = FirebaseDatabase.getInstance().getReference();
DatabaseReference pendingRef = db.child("Pending");
Query queryByKey = pendingRef.orderByKey().startAt("211010");

但这不会提供预期的结果。为什么?由于@FrankvanPuffelen 在以下答案中提供的原因:

Firebase OrderByKey with startAt and endAt giving wrong results

因此,要解决此问题,您拥有的最佳选择是仅对键使用数值。所以一个简单的解决方案是在键前面加上一个常量字符串。所以对应的查询应该是这样的:

Query queryByKey = pendingRef.orderByKey().startAt("*211010").endAt("*211010" + "\uf8ff");
//                                                  ?               ?

数据库中的键应该是这样的:

Firebase-root
  |
  --- *211010...
  |
  --- *211010...
  |
  --- *211010...

编辑:

我只是举了下面的例子:


  "Pending" : 
    "2110101" : 
      "name" : 1
    ,
    "2110102" : 
      "name" : 2
    ,
    "2110103" : 
      "name" : 3
    ,
    "2110114" :  //It's 21-10-11 and not  //It's 21-10-10
      "name" : 4
    ,
  

使用以下查询(号码前未添加*):

Query queryByKey = pendingRef.orderByKey().startAt("211010").endAt("211010" + "\uf8ff");

我得到以下结果:

name: 1
name: 2
name: 3
name: 4

所以我得到了所有的结果。但是,当我使用时:


  "Pending" : 
    "*2110101" : 
      "name" : 1
    ,
    "*2110102" : 
      "name" : 2
    ,
    "*2110103" : 
      "name" : 3
    ,
    "*2110114" :  //It's 21-10-11 and not  //It's 21-10-10
      "name" : 4
    ,
  

以及以下查询(之前添加了*):

Query queryByKey = pendingRef.orderByKey().startAt("*211010").endAt("*211010" + "\uf8ff");

我只得到:

name: 1
name: 2
name: 3

所以它也适用于这种情况。

【讨论】:

所以我需要在要保存的数据前面放一个符号?如果我搜索 211010 和接下来的 3 天(如 211013)会怎样 是的,没错。我选择使用*,但你可以选择任何你想要的,只要它不是数字。试一试,告诉我它是否有效。 okok 让我试试看它是否有效:) 好的,期待看到您的反馈。 嘿@AlexMamo。像往常一样的好答案?---考虑到键的大小,我怀疑SDK会在这种情况下强制转换为数组。只有当键/查询结果开始接近0 时才会出现这个问题,这似乎不会在这里发生。

以上是关于根据子数据前面的6位搜索firebase实时数据库,我想查询两个数字(日期)之间的数据的主要内容,如果未能解决你的问题,请参考以下文章

如何使用两个子值在 Firebase 中进行搜索?

如何从 firebase 实时数据库中获取子值?

使用颤振从 Firebase 实时数据库中读取子节点的数量

Firebase实时数据库如何在没有密钥的情况下获取子记录

如何在 Flutter 中获取嵌套 firebase 数据的所有子数据?

Firebase 实时数据库在查询之间按单词搜索?