javascript - Firebase rtdb 如何使用 orderByKey、startAt、endAt 查询一系列字符串?

标签 javascript firebase firebase-realtime-database

我有一个 Firebase 查询,如下所示:

this.db.object(`...irrelevent`).query
      .orderByKey().startAt(startVal).endAt(`${endVal}\uf8ff`).once('value').then(res => {
        if (res.val()) {
          // value returned
        }
      });

我正在查询的区域的结构如下所示

Structure of Data

根据发现的文档 here当使用按键排序功能时,它首先尝试将键按数字排序,然后按字典顺序排序。正如您在图片中看到的,我的键是字符串。

startVal = "0015"endVal = "0060" 时,查询不太有效,因为它返回此 {0000-0015: "a ”,0015-0075:“-M-BCseCnboNM9zB3o5S”}。根据我的理解,它不应该返回对象的第一个属性,但是当我设置 startVal = "0795"endVal = "0810" 时,它返回:

{0000-0015: "a"
0015-0075: "-M-BCseCnboNM9zB3o5S"
0150-0240: "-M-BCxH9URUtYQg06wXE"
0300-0360: "-M-BD-YIAXO2FMVac0PW"}

这对我来说似乎不正确,因为它不应该返回任何内容,因为 startAt“0795”和 endAt“0810”的字符串之间不存在数据。

我的目标是能够传入一个startVal(例如“0000”)和一个endVal(例如“0030”)并返回

{0000-0015: "a"
0015-0075: "-M-BCseCnboNM9zB3o5S"}

有人可以让我直接理解 startAt 和 endAt 查询在查询一系列字符串时如何工作吗?

最佳答案

我认为您在这里看到了某种数组强制。

我用这个 JSON 进行了测试:

{
  "0000-0015": "a",
  "0015-0075": "-M-BCseCnboNM9zB3o5S",
  "0150-0240": "-M-BCxH9URUtYQg06wXE",
  "0300-0360": "-M-BD-YIAXO2FMVac0PW",
  "key-0000-0015": "a",
  "key-0015-0075": "-M-BCseCnboNM9zB3o5S",
  "key-0150-0240": "-M-BCxH9URUtYQg06wXE",
  "key-0300-0360": "-M-BD-YIAXO2FMVac0PW",
}

这段代码:

function query(start, end) {
  ref.orderByKey().startAt(start).endAt(end)
  .once('value').then(snapshot => {
    console.log(`startAt("${start}").endAt("${end}"): ${snapshot.numChildren()} result(s)`)
    snapshot.forEach((child) => {
      console.log(`"${child.key}"`)
    });
  });
}

query("0000", "0015");
query("0000-", "0015~");
query("0015-", "0060~");
query("key-0000", "key-0015");

我得到的输出是:

startAt("0000").endAt("0015"): 0 result(s)
startAt("0000-").endAt("0015~"): 2 result(s)
  "0000-0015"
  "0015-0075"
startAt("0015-").endAt("0060~"): 1 result(s)
  "0015-0075"
startAt("key-0000").endAt("key-0015"): 1 result(s)
  "key-0000-0015"

除了第一个结果之外的所有结果看起来都是正确的,这就是为什么我认为这些数字以某种方式通过(未填充的)数组索引进行转换(因此 0 而不是 "0000" ),这样就不起作用了。

我建议始终在数字键前添加字母数字字符串作为前缀,以防止出现此类行为,就像我在上面使用 key- 前缀所做的那样。

有关我的完整测试台,请参阅:https://jsbin.com/roluhip/2/edit?js,console

关于javascript - Firebase rtdb 如何使用 orderByKey、startAt、endAt 查询一系列字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60050321/

相关文章:

javascript - 正则表达式格式字符串数字,在 javascript 中带有逗号和 2 位小数

c# - Asp.net UserControl 实现 OnClientClick 事件

java - 如何从 firebase 获取 json 列的名称?我在问题下面留下了一个例子

firebase - 当我使用 Android 测试实验室运行 Espresso 测试时触发矩阵测试时出错

firebase - flutter : how to get newly added record from firebase real time database?

javascript - AngularJs - UI 中的字段未反射(reflect)更新的模型值

javascript - 使用 PHP 将简单的 HTML 表单写入 SQL DB,遭到机器人攻击

javascript - 从 Firebase 中删除项目

java - Firebase .orderByChild - 尝试对数字进行排序,但它只对第一个数字进行排序

java - 我无法通过我的应用程序从 firebase 检索动态链接,因为 pendingdynamiclinkdata 为 null