在Firebase中搜索自定义字符串键

时间:2017-01-15 12:25:40

标签: firebase firebase-realtime-database

我在Firebase中尝试使用自定义键,并希望获得有关此设置的建议。这里我在ADDRESS_ID中有这个字符串键列表(参见下面的代码),我想在它们中搜索。

让我们说我知道我有这个地址: ((fss)是正斜杠)

Firebase密钥:

 "US(fss)district of columbia(fss)washington(fss)1600 pennsylvania ave nw" 

我希望找到至少拥有

的每个密钥
"US(fss)district of columbia(fss)washington(fss)pennsylvania ave nw"

这意味着我想在“宾夕法尼亚大道”上找到所有地址吧..

然后查询应该返回此权限:(见下面的代码)

"US(fss)district of columbia(fss)washington(fss)1606 pennsylvania ave nw"
"US(fss)district of columbia(fss)washington(fss)1605 pennsylvania ave nw"
"US(fss)district of columbia(fss)washington(fss)1603 pennsylvania ave nw"
"US(fss)district of columbia(fss)washington(fss)1600 pennsylvania ave nw"

我应该如何构建查询?

我使用自定义键这样做的原因是因为搜索地址将会发生分配。如您所见,每个键都包含“ADDRESSES”的推送键(参见下面的代码)。搜索更大的“地址”将是代价高昂的

这是一个好方法还是我应该重新考虑因为我的查询是不可能的或昂贵的dunno。希望你能看到我得到的东西。我只使用Firebase 4个月,因为它有很棒的Firebase代号

"ADDRESS_ID" : {
      "US(fss)district of columbia(fss)washington(fss)1600 pennsylvania ave nw" : {
        "-KZhVUg43lazrLQbIuLJ" : "true"
      },
      "US(fss)district of columbia(fss)washington(fss)1600 pennsylvania ave se" : {
        "-KZs0G5-FP3QW3MeoWre" : "true"
      },
      "US(fss)district of columbia(fss)washington(fss)1602 pennsylvania ave se" : {
        "-KZrzqjDosglsZBmu46M" : "true"
      },
      "US(fss)district of columbia(fss)washington(fss)1603 pennsylvania ave nw" : {
        "-K_BKBS_xwjmE_n_gG7A" : "true"
      },
      "US(fss)district of columbia(fss)washington(fss)1604 pennsylvania ave se" : {
        "-K_BKKeQQe4Kb4xi6RWo" : "true"
      },
      "US(fss)district of columbia(fss)washington(fss)1605 pennsylvania ave nw" : {
        "-K_Dq0W4-BXeAJaoq0MT" : "true"
      },
      "US(fss)district of columbia(fss)washington(fss)1606 pennsylvania ave nw" : {
        "-K_EFIVvcjfga3oILx9Q" : "true"
      },
      "US(fss)district of columbia(fss)washington(fss)1607 pennsylvania ave se" : {
        "-K_DtORcp-In3LqxYJSU" : "true"
      }
    },

供参考:

"US" : {
    "ADDRESSES" : {
      "-KZhVUg43lazrLQbIuLJ" : {
        "lat" : 38.8976758,
        "legacy" : "HnhLyXRxUINmlltKOfxx2QBYiQ53",
        "lng" : -77.0364823,
        "path" : "US/district of columbia/washington/1600 pennsylvania ave nw",
        "placeId" : "ChIJ437B3ry3t4kRRV7Us0ixIPk",
        "pushId" : "-KZhVUg43lazrLQbIuLJ",
        "url" : "https://maps.google.com/?q=1600+Pennsylvania+Ave+NW,+Washington,+DC+20500,+USA&ftid=0x89b7b7bcdec17ee3:0xf920b148b3d45e45"
      },
      "-KZrzqjDosglsZBmu46M" : {
        "lat" : 38.89871249999999,
        "legacy" : "HnhLyXRxUINmlltKOfxx2QBYiQ53",
        "lng" : -77.0377377,
        "path" : "US/district of columbia/washington/1602 pennsylvania ave nw",
        "placeId" : "ChIJcTGziry3t4kR66DS_AYdhrg",
        "pushId" : "-KZrzqjDosglsZBmu46M",
        "url" : "https://maps.google.com/?q=1602+Pennsylvania+Ave+NW,+Washington,+DC+20500,+USA&ftid=0x89b7b7bc8ab33171:0xb8861d06fcd2a0eb"
      },

1 个答案:

答案 0 :(得分:2)

Firebase数据库查询只能选择相同的特定节点或以特定值开头的节点。这就是为什么我们通常将它们称为"范围查询":它们选择一系列节点。

您当前的密钥不允许选择一系列地址。原因是你有街道名称前的地址编号,而显然你想在街道(甚至整条街道)中选择一系列数字。

要允许您想要的查询,您应该将该数字与街道名称分开。所以:

"US(fss)district of columbia(fss)washington(fss)pennsylvania ave nw(fss)1600" 

使用这样的数据结构,您可以选择pennsylvania ave nw上的所有人:

ref.startAt("US(fss)district of columbia(fss)washington(fss)pennsylvania ave nw(fss)")
   .endAt("US(fss)district of columbia(fss)washington(fss)pennsylvania ave nw(fss)")

你甚至可以通过以下方式获得一系列数字:

ref.startAt("US(fss)district of columbia(fss)washington(fss)pennsylvania ave nw(fss)1600")
   .endAt("US(fss)district of columbia(fss)washington(fss)pennsylvania ave nw(fss)1700")