有什么方法可以在 Firebase Bolt 的嵌套数组(或映射)中可靠地指定索引?
Is there any way to reliably specify an index within a nested Array (or Map) in Firebase Bolt?
在数组上创建索引非常简单:
type Root { level_1: Level_1[]; }
type Level_1 { fieldToBeIndexed: String; }
path / is Root {}
path /level_1 { index() = ["fieldToBeIndexed"]; }
提供以下内容(为了便于阅读,删除了验证):
{
"rules": {
"level_1": {
"$key1": {
"fieldToBeIndexed": {}
},
".indexOn": ["fieldToBeIndexed"]
}
}
}
但是因为自动生成的键 ($key1
) 用于数组,这意味着我们不能可靠地引用它下面的任何路径,以防结构(或实现)的变化导致键的名称改变。
因为索引似乎只能在 path
语句中定义,这是否意味着在以下情况下无法索引 fieldToBeIndexed
?
type Root { level_1: Level_1[]; }
type Level_1 { level_2: Level_2[]; }
type Level_2 { fieldToBeIndexed: String; }
path / is Root {}
转换为:
{
"rules": {
"level_1": {
"$key1": {
"level_2": {
"$key2": {
"fieldToBeIndexed": {}
}
// How to get the index here?
}
}
}
}
}
你是对的 - 为了将索引放在通配符路径下,你必须专门命名通配符,以便你可以在路径语句中使用它。如果您为同一位置组合类型和路径 - 您应该允许 Any | 类型具有单独路径语句的 属性 为空。
type Level1 {
fieldToBeIndexed: String;
level_2: Any | Null;
}
type Level2 {
anotherIndexedField: String;
}
path /level_1 {
index() = "fieldToBeIndexed";
/$primary is Level1 {
/level_2 {
index() = "anotherIndexedField";
/$secondary is Level2;
}
}
}
在数组上创建索引非常简单:
type Root { level_1: Level_1[]; }
type Level_1 { fieldToBeIndexed: String; }
path / is Root {}
path /level_1 { index() = ["fieldToBeIndexed"]; }
提供以下内容(为了便于阅读,删除了验证):
{
"rules": {
"level_1": {
"$key1": {
"fieldToBeIndexed": {}
},
".indexOn": ["fieldToBeIndexed"]
}
}
}
但是因为自动生成的键 ($key1
) 用于数组,这意味着我们不能可靠地引用它下面的任何路径,以防结构(或实现)的变化导致键的名称改变。
因为索引似乎只能在 path
语句中定义,这是否意味着在以下情况下无法索引 fieldToBeIndexed
?
type Root { level_1: Level_1[]; }
type Level_1 { level_2: Level_2[]; }
type Level_2 { fieldToBeIndexed: String; }
path / is Root {}
转换为:
{
"rules": {
"level_1": {
"$key1": {
"level_2": {
"$key2": {
"fieldToBeIndexed": {}
}
// How to get the index here?
}
}
}
}
}
你是对的 - 为了将索引放在通配符路径下,你必须专门命名通配符,以便你可以在路径语句中使用它。如果您为同一位置组合类型和路径 - 您应该允许 Any | 类型具有单独路径语句的 属性 为空。
type Level1 {
fieldToBeIndexed: String;
level_2: Any | Null;
}
type Level2 {
anotherIndexedField: String;
}
path /level_1 {
index() = "fieldToBeIndexed";
/$primary is Level1 {
/level_2 {
index() = "anotherIndexedField";
/$secondary is Level2;
}
}
}