是否有任何方法可以可靠地在Firebase Bolt中的嵌套数组(或映射)中指定索引?

是否有任何方法可以可靠地在Firebase Bolt中的嵌套数组(或映射)中指定索引?,firebase,firebase-realtime-database,firebase-security,Firebase,Firebase Realtime Database,Firebase Security,在数组上创建索引非常简单: type Root { level_1: Level_1[]; } type Level_1 { fieldToBeIndexed: String; } path / is Root {} path /level_1 { index() = ["fieldToBeIndexed"]; } 给出以下内容(删除可读性验证): 但是,由于数组使用了自动生成的键($key1),这意味着如果结构(或实现)中的更改导致键的名称更改,我们无法可靠地引用它下面的任何路径 由于索引

在数组上创建索引非常简单:

type Root { level_1: Level_1[]; }
type Level_1 { fieldToBeIndexed: String; }

path / is Root {}
path /level_1 { index() = ["fieldToBeIndexed"]; }
给出以下内容(删除可读性验证):

但是,由于数组使用了自动生成的键(
$key1
),这意味着如果结构(或实现)中的更改导致键的名称更改,我们无法可靠地引用它下面的任何路径

由于索引似乎只能在
path
语句中定义,这是否意味着在以下场景中不可能将
field索引为index

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?
        }
      }
    }
  }
}

您是对的-为了在通配符路径下放置索引,您必须明确命名通配符,以便在path语句中使用它。如果将同一位置的类型和路径组合在一起,则应允许具有单独path语句的属性的类型为Any | Null

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 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;
    }
  }
}