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

Javascript Firebase rtdb如何使用orderByKey、startAt和endAt查询一系列字符串?,javascript,firebase,firebase-realtime-database,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 } }); 我查询的区域的结构如下所示 根据使用“按键排序

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

this.db.object(`...irrelevent`).query
      .orderByKey().startAt(startVal).endAt(`${endVal}\uf8ff`).once('value').then(res => {
        if (res.val()) {
          // value returned
        }
      });
我查询的区域的结构如下所示

根据使用“按键排序”功能时发现的文档,它首先尝试将键按数字排序,然后按字典顺序排序。如图所示,我的键是字符串

当startVal=0015和endVal=0060时,查询无法正常工作,因为它返回这个{0000-0015:a,0015-0075:-M-BCseCnboNM9zB3o5S}。根据我的理解,它不应该返回对象的第一个属性,但当我设置set startVal=0795和endVal=0810时,它返回:

{0000-0015: "a"
0015-0075: "-M-BCseCnboNM9zB3o5S"
0150-0240: "-M-BCxH9URUtYQg06wXE"
0300-0360: "-M-BD-YIAXO2FMVac0PW"}
对我来说,这似乎不正确,因为它应该不返回任何内容,因为起始于0795和结束于0810的字符串之间不存在任何数据

我的目标是能够通过像0000这样的起始值和像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,这样就不起作用了

我建议始终使用字母数字字符串作为数字键的前缀,以防止这种行为,正如我在上面使用键前缀所做的那样


有关我的完整测试平台,请参见:

这太棒了!谢谢你的回复。当我尝试值startAtkey-0030和endAtkey-0045时,我希望它返回key-0015-0075:-M-BCseCnboNM9zB3o5S,因为startAt和endAt值在该键的值的范围内。不幸的是,它没有返回任何内容。有什么建议吗?我想你误解了Firebase查询的工作原理。它们不知道密钥的结构,只执行字典顺序和排序操作。从词典编纂的角度看,key-0015不在key-0030和key-0045之间,因此不会返回。这是有道理的。谢谢你的帮助!