OrderByChild добавление еще одного элемента в результат - PullRequest
0 голосов
/ 22 декабря 2018

Я пытаюсь получить только события, которые есть у определенного пользователя, дело в том, что после выполнения orderByChild() он фильтрует еще одно событие, которое мне не нужно.

Код

//I find the user that belongs to a certain Tutor
        mDatabase.child("tutorjugadores").child(mAuth.getCurrentUser().getUid()).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshotJugador) {
                for(final DataSnapshot snapshotJugadoresTutor : dataSnapshotJugador.getChildren()){
                    if(dataSnapshotJugador.exists()){

                        //If the user has not assisted to a certain event, I get the user that belongs to the user and get the event ID
                        mDatabase.child("asistenciasjugadores").orderByChild(snapshotJugadoresTutor.getKey()).addListenerForSingleValueEvent(new ValueEventListener() {
                            @Override
                            public void onDataChange(@NonNull DataSnapshot dataSnapshotEvento) {
                                for(DataSnapshot snapshotEventos : dataSnapshotEvento.getChildren()){
                                    //Getting the event key from that user

                                    String eventKey = snapshotEventos.getKey();
                                    Log.d(TAG, "Event : "+eventKey + "  of the user "+snapshotJugadoresTutor.getKey());
                                }


                            }

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

                            }
                        });

                    }
                }
            }

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

            }
        });

Теперь, это моя структура базы данных

enter image description here

Проблема

Теперь, когда я запускаю этот код ивыполнить журнал, чтобы получить событие для пользователя 2UHHZWR6B8P9XJPuLYrAg6aEgN63, я получаю еще одно событие, которое не принадлежит этому пользователю, это событие -LU930PpCaQXT8CvUbc8

Мой журнал

Событие : -LU930PpCaQXT8CvUbc8 пользователя 2UHHZWR6B8P9XJPuLYrAg6aEgN63

Событие : -LTRz61EUEUUUUUUEUUU из 10 * * 10-RU* 2UHHZWR6B8P9XJPuLYrAg6aEgN63

Событие : -LTSGFGdW1nQbtd9HOBh пользователя 2UHHZWR6B8P9XJPuLYrAg402 * * * * * * * 2UHHZWR6B8P9XJPuLYrAg6aEgN63

Как видите, список всех событий для этого пользователя, ноЕсли у пользователя только 3 события, связанных с ним.

Когда я закажу с этой строкой

.orderByChild(snapshotJugadoresTutor.getKey())

Я ожидаю получить только узлы с идентификатором userID 2UHHZWR6B8P9XJPuLYrAg6aEgN63, а затем цикл иполучить идентификатор каждого события от этого пользователя, но вместо этого я также получаю идентификатор события от этого пользователя GVD0bLDf41VDdraN67mXjAS6KPk1.

1 Ответ

0 голосов
/ 22 декабря 2018

Вы не можете фильтровать со строкой, используя только базы данных на основе JSON, такие как Firebase.И orderByChild только изменяет сортировку возвращаемых значений.Таким образом, вы в основном упорядочиваете все значения под этим ключом, фильтрация не происходит.После этой точки у вас есть 3 варианта для продолжения.

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

Вариант 2 - Рекомендуется: Вы можете изменить свою структуру данных.Создайте другой узел, такой как «UserEvents».Под ним хранят UID.И под этим UID должны быть только события этого пользователя.

Вариант 3 - Рекомендуемый и функциональный: Вы можете использовать Elasticsearch.Это отлично подходит для сложных запросов.Вы можете использовать его вместе с Firebase с облачными функциями Google после перехода на тарифный план «Плати как есть» или интегрировать другой сервер с базой данных Firebase с помощью расширения Flashlight.

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