.indexOn 如何与用户和唯一键一起使用?

Posted

技术标签:

【中文标题】.indexOn 如何与用户和唯一键一起使用?【英文标题】:How does .indexOn works with users and unique keys? 【发布时间】:2020-02-14 07:07:49 【问题描述】:

我对 firebase 中的索引规则感到困惑。我有这个数据库,我想在battery_and_cables 中提取distance_traveled。问题是,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

【问题讨论】:

【参考方案1】:

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

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


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

如您所见,我在此处为1 节点添加了$id 级别。现在这意味着您在每个 /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

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

另见:

Firebase Query Double Nested Firebase query if child of child contains a value

【讨论】:

谢谢!我现在对索引的工作原理有了更多的了解。我现在的问题是如何在 pyrebase 中调用它,因为在输入 /mileage_maintenance/$id/battery_and_cables 时会出现 "error" : "Invalid path: Invalid token in path"。还是我理解错了? 这听起来像是您试图在 key 中使用/,这是不允许的。这就是为什么我的最后一个 JSON sn-p 使用 ~ 作为分隔符。

以上是关于.indexOn 如何与用户和唯一键一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 安全规则:.indexOn 唯一 ID

如何使用auth.uid变量在firebase上设置indexOn规则?

唯一索引与主键索引的比较

外键与用户模型上传一起使用

SQLServer 唯一键约束和唯一索引有啥区别

如何在 Sequelize 中使用外键和常规键创建复合唯一约束?