Я искал и делал метод проб и ошибок в течение нескольких дней, но не смог заставить что-либо работать. При тестировании я создал несколько тестовых узлов в моей базе данных Firebase Realtime, чтобы попытаться отработать логи функции c. Мое дерево файлов выглядит так:
Просто пытаясь заставить работать основы, я создал несколько пользователей в узле TestUsers
, каждый из которых имеют очень простую дочернюю структуру Statistics
, а затем значение orbs
.
Что я пытаюсь сделать:
После обновления orbs
значение для любого из пользователей, я хочу написать (ну, технически «обновить») дочерние элементы Output/firstPlace
, чтобы включить имя пользователя и количество шаров для первых трех пользователей (которые имеют наибольшее количество шаров из всех пользователей) под TestUsers
.
Кажется очень простым, и, поверьте мне, я знаю, что есть тонна документации по сортировке и фильтрации данных в базе данных Firebase Realtime Database, но я не смог собрать это воедино за несколько дней чтения эта документация.
Я использую VS Code для написания своих функций и развертываю их в своем проекте Firebase.
Функция, которую я написал, чтобы попытаться выполнить вышеизложенное, такова:
//Define a new function with a base path and set it to run when a child of this path is changed
exports.testTopPlayers1 = functions.database.ref('/TestUsers/{user}/Statistics').onUpdate(_ => {
var allPlayersRef = admin.database().ref('/TestUsers/{user}'); //When this function runs, assign a new path of all users
//Get a snapshot of the top 3 users with the highest orb count
allPlayersRef.orderByChild('orbs').limitToLast(3).once('value', (snap) => {
//For each child from the above snap (should be 3)...
snap.forEach((child, context) => {
const username = context.params.user; //Assign the username to a const
const afterOrbAmount = child.after.val();
const orbAmount = afterOrbAmount.orbs; //Assign the number of orbs to a const
//Return (Promise?) by updating the data in '/Output/firstPlace' with the username and orb amount.
return admin.database().ref('/Output/firstPlace').update({[username]: [orbAmount]});
});
})
})
Я бы ожидал, что с .forEach
он должен выполнить запись в '/Output/firstPlace
часть 3 раза, что даст мне 3 новые пары ключ-значение. Но ничего не происходит.
Исходя из того, что я пытаюсь сделать, вы можете либо исправить мой код, либо показать мне правильный способ добиться сортировки высоких результатов, как это на бэкэнде?