首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >防火墙数据库'DeepQuery',我的.indexOn规则是什么?

防火墙数据库'DeepQuery',我的.indexOn规则是什么?
EN

Stack Overflow用户
提问于 2018-10-10 09:52:15
回答 2查看 48关注 0票数 0

JSON数据显示了各种学院的可用学科,

代码语言:javascript
复制
{
  "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节点上编写一个深入的查询。查询代码是:

代码语言:javascript
复制
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规则。你能帮帮我吗?

EN

回答 2

Stack Overflow用户

发布于 2018-10-10 11:23:09

下面是一个示例规则代码:正如您在下面看到的,关键是多深并不重要。

代码语言:javascript
复制
{
  "rules": {
    ".read": true,
    ".write": "auth != null",
    "AvailableDisciplines": {
      "$otherKeys":{
       ".indexOn":["disciplineName"] 
      }
    }
   }
 }

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

票数 0
EN

Stack Overflow用户

发布于 2018-10-10 13:42:51

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

代码语言:javascript
复制
FirebaseDatabase.getInstance().getReference()
    .child("Trial").child("AvailableDisciplines")
    .orderByChild("Disciplines/EE/disciplineCode").equalTo("EE")
    ...

现在您有了一个实际属性,您可以在以下内容上定义索引:

代码语言:javascript
复制
{
  "rules": {
    "Trial": {
      "AvailableDisciplines": {
        "$collegecode": {
          "Disciplines": {
            "$discipline": {
              ".indexOn": "disciplineCode"
            }
          }
        }
      }
    }
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52737410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档