【问题标题】:Firebase database 'DeepQuery', what could be my .indexOn rule?Firebase 数据库“DeepQuery”,我的 .indexOn 规则可能是什么?
【发布时间】:2018-10-10 09:52:15
【问题描述】:

JSON 数据显示了各个学院可用学科

{
  "AvailableDisciplines": {
    "4JN": {
      "Disciplines": {
        "CV": {
          "disciplineCode": "CV",
          "disciplineName": "Civil Engineering",
          "siNo": "1"
        },
        "EC": {
          "disciplineCode": "EC",
          "disciplineName": "Electronics and Communication Engineering",
          "siNo": "2"
        },
        "EE": {
          "disciplineCode": "EE",
          "disciplineName": "Electronics and Electricals Engineering",
          "siNo": "3"
        }
      }
    },
    "4MT": {
      "Disciplines": {
        "EE": {
          "disciplineCode": "EE",
          "disciplineName": "Electronics and Electricals Engineering",
          "siNo": "1"
        },
        "CS": {
          "disciplineCode": "CS",
          "disciplineName": "Computer Science Engineering",
          "siNo": "2"
        },
        "IS": {
          "disciplineCode": "IS",
          "disciplineName": "Information Science Engineering",
          "siNo": "3"
        }
      }
    },
    "1KT": {
      "Disciplines": {
        "TE": {
          "disciplineCode": "TE",
          "disciplineName": "Telecommunication Engineering",
          "siNo": "1"
        },
        "CS": {
          "disciplineCode": "CS",
          "disciplineName": "Computer Science Engineering",
          "siNo": "2"
        },
        "IS": {
          "disciplineCode": "IS",
          "disciplineName": "Information Science Engineering",
          "siNo": "3"
        }
      }
    }
  }
}

其中 4JN、4MT 和 1KT 是学院代码。如果我想查询所有提供土木工程学科的大学,我必须在 AvailableDisciplines 节点上编写一个深度查询。查询代码为:

FirebaseDatabase.getInstance().getReference()
    .child("Trial").child("AvailableDisciplines")
    .orderByChild("Disciplines/EE").startAt("")
    .addListenerForSingleValueEvent(new ValueEventListener() {      
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            Log.v("log", "datasnapshot: " + String.valueOf(dataSnapshot));
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
}));

我能够按照我的期望获取数据。但是,我不知道如何为这种情况编写 .indexOn 规则。你能帮帮我吗?

【问题讨论】:

    标签: android firebase firebase-realtime-database firebase-security


    【解决方案1】:

    这是一个示例规则代码: 正如您在下面看到的,密钥的深度无关紧要。

    {
      "rules": {
        ".read": true,
        ".write": "auth != null",
        "AvailableDisciplines": {
          "$otherKeys":{
           ".indexOn":["disciplineName"] 
          }
        }
       }
     }
    

    您可以在同一级别添加更多密钥,即:".indexOn":["disciplineName", "disciplineCode","siNo"]

    【讨论】:

    • 谢谢。我尝试了您的规则,但收到以下警告:使用未指定的索引。考虑将 Trial/AvailableDisciplines 中的 '".indexOn": "Disciplines/EE"' 添加到您的安全和 Firebase 数据库规则中,以获得更好的性能
    • 我的结构几乎与索引键相同。让我再检查一下。但老实说,弗兰克所说的更正确?
    【解决方案2】:

    在您当前的数据模型中,您的查询应检查实际值(而不是节点的存在)。例如:

    FirebaseDatabase.getInstance().getReference()
        .child("Trial").child("AvailableDisciplines")
        .orderByChild("Disciplines/EE/disciplineCode").equalTo("EE")
        ...
    

    现在您有了一个可以定义索引的实际属性:

    {
      "rules": {
        "Trial": {
          "AvailableDisciplines": {
            "$collegecode": {
              "Disciplines": {
                "$discipline": {
                  ".indexOn": "disciplineCode"
                }
              }
            }
          }
        }
      }
    }
    

    【讨论】:

    • 谢谢。但是我收到了这个警告:“使用未指定的索引。考虑在 Trial/AvailableDisciplines 中将 '".indexOn": "Disciplines/EE/disciplineCode"' 添加到您的安全和 Firebase 数据库规则中,以获得更好的性能。”
    • 啊……没错。在那种情况下,我不确定查询是否可行。在这里查看我的答案:stackoverflow.com/questions/27207059/…
    • 哦!我想用这个查询深度路径更新我的“非规范化”数据。在不同的情况下,如果我使用 Firestore 并且不担心读取次数,是否可以完全“规范化”我的数据库?
    猜你喜欢
    • 1970-01-01
    • 2019-01-14
    • 2017-07-11
    • 2016-09-29
    • 2019-09-11
    • 2016-12-28
    • 2017-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多