Таблица лидеров с облачными функциями Firebase - PullRequest
0 голосов
/ 24 октября 2018

Моя текущая структура базы данных выглядит следующим образом: enter image description here

, которая в основном имеет таблицу mobile_users и таблицу 100 лучших, которая будет таблицей лидеров.

Я пытаюсь выяснить, как написать облачную функцию, которая выполняется каждую минуту, которая обновляет / заполняет таблицу top100 с помощью идентификатора пользователя, earned_points от mobile_users и сортирует его по earned_points.

Должен ли я добавить поле ранга в эту таблицуили есть способ упорядочить таблицу из порядка asc / desc на основе mobile_users?

Моя текущая функция выглядит так

exports.dbRefOnWriteEvent = functions.database.ref('/mobile_user/{userId}/{earned_points}').onWrite(event => {
    var ref = admin.database().ref("/top100");
    ref.orderByChild("earned_points").once("value", function(dataSnapshot) {
        var i = 0;
        dataSnapshot.forEach(function(childSnapshot) {
          var r = (dataSnapshot.numChildren() - i);
          childSnapshot.ref.update({rank: r},function(error) {
              if (error != null)
                console.log("update error: " + error);
          });
          i++;
        });
    });
});

Мне еще предстоит выяснить, как определить облакоФункция для выполнения каждую минуту.У меня проблемы с структурированием запросов такого типа.

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

Ответы [ 2 ]

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

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

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

Leaderboard
           |-- [0] 
                |-- score: 5000
                |-- uid: 4zzdawqeasdasq2w1
           |---[1]
                |-- score: 4990
                |-- uid: 889asdas1891sadaw

Тогда когдаВы получаете новый счет, вы обновляете узел пользователя, а затем также обновляете таблицу лидеров.Затем вы просто берете uid и ищите имя на узле пользователя.

Как и в других постерах, используйте функцию HTTP Firebase Cloud и задание chron.

Однако я бы порекомендовал вамиспользуйте задание chron просто для того, чтобы поддерживать облачную функцию в режиме реального времени (ищите функции холодного запуска firebase), но также делайте запрос на выборку для запуска облачной функции из внешнего интерфейса каждый раз, когда пользователь играет в игру и генерирует счет.В противном случае, если вы получаете 10 игр в минуту и ​​они обновляются только раз в минуту, это не будет хорошим опытом для игроков, которые ожидают таблицу лидеров в реальном времени.

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

Создайте функцию HTTP-запроса, которая будет делать ваше дело.

Затем с помощью cron-job каждую минуту вызывайте функцию http firebase: cron-job

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