Запрос OrderBy - Могу ли я заказать внуку "Голосование", хранящееся в базе данных Firebase? - PullRequest
0 голосов
/ 05 февраля 2019

Я пытался найти способ запроса по голосам дочернего узла, чтобы упорядочить данные по количеству голосов.Я почти уверен, что из-за того, как я сохранил данные в базе данных, их нельзя запросить, но в настоящее время я должен хранить их таким образом.

  {
     "45" : {
       "Biological and Ecological" : {
         "Votes" : 1
        }
    },
     "567" : {
       "Technology" : {
         "Votes" : 2
        }
    },
     "620" : {
       "Technology" : {
          "Votes" : 1
        }
  },
     "702" : {
       "Social and Behavioral" : {
          "Votes" : 1
        }

     }
 }

Я пытаюсь сделать заказ ребенком "Голоса"Есть ли способ сделать это?Ниже приведен метод, в котором он отображается в данный момент. Мне известно, что .OrderbyChild ("Votes") не определяет путь правильно, но есть ли способ добиться этого?

   Query query = FirebaseDatabase.getInstance().getReference("CountLikes/").orderByChild("Votes");

   query.addListenerForSingleValueEvent(new ValueEventListener() {

    @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

            for(DataSnapshot child: dataSnapshot.getChildren()) {

                for(DataSnapshot grandchild: child.getChildren()) {
                    arrayList.add("Project " + child.getKey() + "         " + grandchild.getKey() + "        " + (String.valueOf(grandchild.child("Votes").getValue(Long.class)))); 

                    adapter.notifyDataSetChanged();


                }

                }}



        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            throw databaseError.toException();
        }
    });

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

База данных Firebase Realtime может запрашивать дочерние узлы местоположения на основе свойства, если это свойство находится в известном месте с фиксированным путем.

В вашем случае дочерние узлы не имеют фиксированного пути (поскольку ключи Technology и Biological and Ecological не являются фиксированными), поэтому этот запрос невозможен для вашей текущей структуры данных.

Чтобы разрешить запрос, измените структуру данных, чтобы превратить их в плоский список.Например, это может работать:

 "45" : {
   "Category": "Biological and Ecological",
   "Votes" : 1
 }
 "567" : {
   "Category": "Technology",
   "Votes" : 2
 },
 "620" : {
   "Category": "Technology",
    "Votes" : 1
 },
 "702" : {
   "Category": "Social and Behavioral",
   "Votes" : 1
 }

Также см .:

0 голосов
/ 05 февраля 2019

Это немного зависит от того, как ваша модель данных фактически настроена в RealtimeDatabase.В этом случае нет единого пути к данным, по которым вы пытаетесь отсортировать данные (кажется, что это разные типы голосования).

Если у вас есть что-то вроде:

CountLikes: [ // collection
    docId: { // document
        typeOfVote: { // map name
            "votes": number // vote count
        }
    }
]

способ, которым вы пытаетесь упорядочить по дочернему элементу, будет возможен, если «голоса» отделены от «typeOfVote», потому что сейчас вы не можете упорядочить по дочернему элементу через потенциальный подстановочный знак (например, чтобы получить уровень глубже, чем «Технология»).

CountLikes: [
    docId: {
        "votes": number,
        "type": typeOfVote
    }
]

При этом ваш голос "orderByChild" может , вероятно, работа:)

FirebaseDatabase.getInstance().getReference("CountLikes/").orderByChild("votes")

(обновление) Этот ответ от Фрэнка (ипрочтите комментарии) показывает еще один пример / дополнительную информацию для orderByChild.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...