IndexOn для подсчета общего количества пользователей в моей базе данных - PullRequest
0 голосов
/ 31 августа 2018

У меня есть база данных с примерно 7-8 тысячами пользователей, каждый раз, когда я делаю getChildrenCount(), чтобы подсчитать, сколько людей в моем приложении, мне действительно нужно много ждать, пока оно обработается и появится.

Интересно, есть ли способ, например, хранить в моей базе данных длинную переменную, такую ​​как

totalusers = 7561

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

Я думал о чем-то подобном, чтобы следить за моими пользователями и просто запрашивать переменную 1 и получать данные как можно быстрее

"rules": {
    "users": {
        ".indexOn": "totalusers"

    }

это хороший способ реализовать это поведение?

Редактировать:

это то, чем я сейчас занимаюсь

  public long getUsers(DatabaseReference mDatabase){

        mDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if(dataSnapshot.exists()){
                    users = dataSnapshot.getChildrenCount();
                    Log.e(TAG, "onDataChange: "+users);
                }


            }

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

        return users;
    }

но это слишком медленно, например, 1 минута для подсчета 7500 пользователей, а также другие мои операции с firebase не выполняются до конца, поэтому он блокирует мой пользовательский интерфейс и ничего не показывает

спасибо!

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Как вы узнали, Firebase (как и многие базы данных NoSQL) не имеет встроенных операций агрегирования. Поэтому для подсчета количества пользовательских узлов в вашей базе данных теперь необходимо загрузить все пользовательские узлы, а затем подсчитать их в своем приложении: довольно бесполезно использовать пропускную способность, если все, что вам нужно, - это подсчет.

Обычный подход заключается в сохранении счетчика как отдельного значения в базе данных, а затем обновлении этого счетчика при каждом обновлении узла users. Вы можете сделать это из клиентского кода, но в настоящее время вы также можете рассмотреть возможность сделать это из облачных функций для Firebase. Фактически, этот сценарий использования настолько распространен, что является одним из примеров в репозитории functions-samples на Github: https://github.com/firebase/functions-samples/tree/master/child-count

Кстати: ответ Грегорио также полностью действителен. Я просто хотел показать альтернативу, которая немного ближе к вашему текущему подходу.

0 голосов
/ 31 августа 2018

Базы данных Firebase (как в реальном времени, так и в Firestore) являются базами данных NOSQL, и такие вещи, как подсчет, не очень хорошо работают с ними.

Поскольку вы используете проверку подлинности Firebase, вы можете использовать функцию Firebase для достижения своей цели. Вы можете написать функции, которые будут запускаться каждый раз, когда что-то происходит в вашем проекте Firebase. Одной из таких «вещей» является создание пользователя . Короче говоря, вы можете выполнять свою логику каждый раз, когда создается новый пользователь, и обновлять количество своих пользователей с помощью этой логики. Вот пример:

exports.updateUserCount = functions.auth.user().onCreate((user) => {
  // here goes your logic. You'll update the count here
});

Таким образом, вы можете сохранить счет в базе данных в реальном времени или в Firestore. Вам решать, где поставить ценность. Также вы можете сделать то же самое при удалении пользователя, но зарегистрируя функцию с помощью метода onDelete ().

Это будет очень быстро, и у вас будет значение, которое не нужно определять каждый раз, когда вам это нужно. Пожалуйста, обратитесь к ссылке ниже для полной ссылки на функции Firebase

https://firebase.google.com/docs/functions/

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