База данных Firebase 'DeepQuery', каким может быть мое правило .indexOn? - PullRequest
0 голосов
/ 10 октября 2018

Данные 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 правила для этого случая.Не могли бы вы помочь мне, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

В вашей текущей модели данных ваш запрос должен проверять фактическое значение (а не наличие узла).Например:

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

Теперь у вас есть фактическое свойство, для которого вы можете определить индекс:

{
  "rules": {
    "Trial": {
      "AvailableDisciplines": {
        "$collegecode": {
          "Disciplines": {
            "$discipline": {
              ".indexOn": "disciplineCode"
            }
          }
        }
      }
    }
  }
}
0 голосов
/ 10 октября 2018

Вот пример кода правила: как вы видели ниже, не имеет значения, насколько глубокий ключ.

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

Вы можете добавить больше ключей на том же уровне, например: ".indexOn":["disciplineName", "disciplineCode","siNo"]

...