首页 > 解决方案 > .indexOn 如何与用户和唯一键一起使用?

问题描述

我对 firebase 中的索引规则感到困惑。我有这个数据库,我想提取distance_traveled. battery_and_cables问题是,1类似于用户自己设置的用户 ID,因此会有所不同。

我在 pyrebase 中使用了这段代码来提取distance_traveled

db.child("mileage_maintenance").order_by_child("distance_traveled").get()

但我明白了

未定义索引,将路径“/mileage_maintenance”的“.indexOn”:“distance_traveled”添加到规则中

这是我的数据库:

这是我的数据库

我的任何规则:

{
  "rules": {
    ".read": true,
    ".write": true,
    "mileage_maintenance": {
      "battery_and_cables":{
        ".indexOn": ["distance_traveled"]
       }
    },
  }
}

有没有什么方法可以通过1push获得 的钥匙distance_traveled

标签: firebasefirebase-realtime-databasefirebase-securitypyrebase

解决方案


Firebase 实时数据库查询在您运行查询的位置下的节点的平面列表上工作。因此,在您的情况下,查询会考虑节点的直接子mileage_maintenance节点(这只是1屏幕截图中的节点)。

您可以在规则中使用通配符,例如您的情况:

{
  "rules": {
    ".read": true,
    ".write": true,
    "mileage_maintenance": {
      "$id": {
        "battery_and_cables":{
          ".indexOn": ["distance_traveled"]
         }
      }
    }
  }
}

如您所见,我$id在这里为1节点添加了一个级别。现在这意味着您在每个/mileage_maintenance/$id/battery_and_cables节点上为distance_traveled每个子节点的属性定义了一个索引。

因此,使用此索引,您可以查询值的特定/mileage_maintenance/$id/battery_and_cables路径distance_traveled。但是您不能仅/mileage_maintenance针对其下的所有distance_traveled值运行查询。

如果您需要这样的查询,您将需要修改/增强您的数据模型以允许它。例如,通过引入一个平面的distance_traveled节点列表,您可以查询:

"distance_traveled": {
   "1000000": "1/battery_and_cables/-M01CT...1hMj"
}

或者

"distance_traveled": {
   "1~battery_and_cables~-M01CT...1hMj": 1000000
}

最后一个模型中~的 只是该键中的段的单独部分,因为/不允许。

另见:


推荐阅读