.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"]
,
有没有什么方法可以通过1
和push
键获取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 如何与用户和唯一键一起使用?的主要内容,如果未能解决你的问题,请参考以下文章