Firebase как читать значения до указанной длины

Я хочу получить общее число, пока не указано.

это моя база данных: изображение базы данных

Я хочу посчитать, где ticket_status находится not served

пример: я хочу считать до A6, я буду считать A1 до A5, где значение ticket_status" равно not served. так что окончательный счет будет 3.

есть ли какая-то фильтрация?

У меня есть этот код, но он просто считает все узлы со значением «не обслуживается».

dbref.child("Queue").child(a.value.toString()).orderByChild("ticket_status").equalTo("not served").addValueEventListener(object : ValueEventListener{
                                override fun onDataChange(snap: DataSnapshot) {
                                        val count = snap.childrenCount
                              dbref.child("Student_Queue_Reserve").child(idNumber.toString()).child("people_ahead").setValue((count-1).toString())
                                }
                                override fun onCancelled(error: DatabaseError) {
                                }
                            })

Я не уверен, что понимаю. Что именно в этом коде работает не так, как вы ожидаете?

Alex Mamo 13.02.2023 16:36

код работает нормально, он читает и считает дочерний элемент со значением «ticket_status» «не обслуживается». на скриншоте я предоставил 8 дочерних элементов. 2 этого дочернего элемента имеют значение «обслуживается» в их «ticket_status». Код будет отображаться как 6, потому что он считает всех дочерних элементов со значением «не обслуживается». я хочу, чтобы я хотел читать только до указанного дочернего ключа. например, я хочу прочитать и подсчитать, где значение «ticket_status» «не обслуживается» до «A5» (см. снимок экрана). A1 и A2 «обслуживаются», а «A3», «A4», «A5» «не обслуживаются». я ожидаю, что результат будет 2,2, потому что "A5" - последний узел

sean 13.02.2023 16:49
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я хочу считать до A6, я буду считать A1 до A5, где значение ticket_status" равно not served. Таким образом, окончательный счет будет 3.

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

Если вам разрешено изменять схему базы данных, вам следует рассмотреть возможность денормализации данных. Таким образом, структура, подобная приведенной ниже, сделает свое дело:

db
|
--- Queue
     |
     --- Accounting Office
           |
           --- served
           |    |
           |    --- A1
           |    |   |
           |    |   --- serving_token: "A001"
           |    |   |
           |    |   --- ticket_status: "served"
           |    |
           |    --- A2
           |        |
           |        --- serving_token: "A002"
           |        |
           |        --- ticket_status: "served"
           |
           --- not served
                |
                --- A3
                |   |
                |   --- serving_token: "A003"
                |   |
                |   --- ticket_status: "not served"
                |
                --- A4
                |   |
                |   --- serving_token: "A004"
                |   |
                |   --- ticket_status: "not served"
                |
                --- A5
                |   |
                |   --- serving_token: "A005"
                |   |
                |   --- ticket_status: "not served"
                |
                --- A6
                    |
                    --- serving_token: "A006"
                    |
                    --- ticket_status: "not served"

Теперь вы можете запросить «необслуживаемый» узел, используя комбинацию Query#orderByKey() и Query#endAt(java.lang.String)

db.child("Queue").child("Accounting Office").child("not served").orderByKey().endAt("A6");

Вы можете попробовать этот подход без запроса:

ArrayList servedArray ;
ArrayList notServedArray ;
  • получить снимок данных
  • цикл через снимок
  • если значение == "served" >> добавить в serveArray
  • иначе, если значение равно == "не обслуживается", добавить в notServedArray

И для подсчета вы можете использовать:

servedArray.size
notServedArray.size

Это означает, что OP загружает весь узел и выполняет фильтрацию на клиенте, верно? Не дорого ли это?

Alex Mamo 14.02.2023 14:53

В документации Firebase говорится: «Примечание: фильтрация и сортировка могут быть дорогими, особенно когда они выполняются на клиенте ...», поэтому я избегал опции запроса. Я так не думаю, если максимальный размер узла составляет 1000 токенов.

Djoxy 14.02.2023 16:12

Да, это правильно, фильтрация и сортировка могут быть дорогими, особенно когда они выполняются на клиенте. И насколько я понимаю, это то, что рекомендует ваш ответ.

Alex Mamo 14.02.2023 16:15

Большое спасибо, я ошибался, я думал, что термин «дорогой» относится к выставлению счетов Firebase.

Djoxy 14.02.2023 16:22

Другие вопросы по теме