Вы можете получить подсчет детей через
firebase_node.once('value', function(snapshot) { alert('Count: ' + snapshot.numChildren()); });
Но я считаю, что это извлекает с сервера все поддерево этого узла. Для огромных списков это кажется большим объемом оперативной памяти и задержек. Есть ли способ получить счетчик (и / или список дочерних имен) без извлечения всего?
Ответы:
Приведенный вами фрагмент кода действительно загружает весь набор данных, а затем считает их на стороне клиента, что может быть очень медленным для больших объемов данных.
Firebase в настоящее время не может подсчитывать дочерние элементы без загрузки данных, но мы планируем добавить его.
На данный момент одним из решений было бы поддерживать счетчик количества дочерних элементов и обновлять его каждый раз, когда вы добавляете нового ребенка. Вы можете использовать транзакцию для подсчета элементов, как в этом коде отслеживания upvodes:
Для получения дополнительной информации см. Https://www.firebase.com/docs/transactions.html.
ОБНОВЛЕНИЕ: Firebase недавно выпустила облачные функции. Благодаря облачным функциям вам не нужно создавать собственный сервер. Вы можете просто написать функции JavaScript и загрузить их в Firebase. Firebase будет отвечать за запуск функций при возникновении события.
Например, если вы хотите подсчитать количество голосов, вам следует создать структуру, подобную этой:
А затем напишите функцию javascript, чтобы увеличить время
upvotes_count
записи вupvotes
узел.Вы можете прочитать документацию, чтобы узнать, как начать работу с облачными функциями .
Также здесь есть еще один пример подсчета сообщений: https://github.com/firebase/functions-samples/blob/master/child-count/functions/index.js
Обновление за январь 2018 г.
Документация по firebase изменилась, поэтому
event
теперь у нас естьchange
иcontext
.В данном примере выдается ошибка с сообщением о
event.data
неопределенном значении. Этот шаблон, кажется, работает лучше:`` `
источник
Это немного поздно, так как несколько других уже хорошо ответили, но я поделюсь, как я могу это реализовать.
Это зависит от того, что Firebase REST API предлагает
shallow=true
параметр.Предположим, у вас есть
post
объект, и у каждого из них может быть несколькоcomments
:Очевидно, вы хотите получать не все комментарии, а только их количество.
Предполагая, что у вас есть ключ для публикации, вы можете отправить
GET
запрос по адресуhttps://yourapp.firebaseio.com/posts/[the post key]/comments?shallow=true
.Это вернет объект пар ключ-значение, где каждый ключ является ключом комментария, а его значение
true
:Размер этого ответа намного меньше, чем при запросе эквивалентных данных, и теперь вы можете рассчитать количество ключей в ответе, чтобы найти свое значение (например, commentCount =
Object.keys(result).length
).Это может не полностью решить вашу проблему, поскольку вы все еще рассчитываете количество возвращаемых ключей, и вы не можете обязательно подписаться на значение по мере его изменения, но это значительно уменьшает размер возвращаемых данных, не требуя каких-либо изменений в вашем схемы.
источник
.json
в конец URL, например:https://yourapp.firebaseio.com/posts/comments.json?shallow=true
Сохраняйте счетчик на ходу - и используйте проверку, чтобы обеспечить его соблюдение. Я вместе взломал это - для того, чтобы вести подсчет уникальных голосов и подсчетов, который продолжает расти! Но на этот раз я проверил свое предложение! (несмотря на ошибки вырезания / вставки!).
«Уловка» здесь в том, чтобы использовать приоритет узла в качестве подсчета голосов ...
Данные:
vote / $ issueBeingVotedOn / user / $ uniqueIdOfVoter = thisVotesCount, priority = thisVotesCount vote / $ issueBeingVotedOn / count = 'user /' + $ idOfLastVoter, priority = CountofLastVote
пользователь может проголосовать только один раз && count должно быть на единицу больше текущего счета && значение данных должно быть таким же, как приоритет.
count (на самом деле последний голосующий) - голос должен существовать и его счетчик равен newcount, && newcount (приоритет) может увеличиваться только на единицу.
Тестовый скрипт для добавления 10 голосов от разных пользователей (в этом примере id faked, если пользователь auth.uid находится в рабочей среде). Обратный отсчет до (i--) 10, чтобы увидеть, что проверка не удалась.
«Риск» здесь заключается в том, что голосование подано, но счетчик не обновляется (взлом или сбой скрипта). Вот почему у голосов есть уникальный `` приоритет '' - сценарий действительно должен начинаться с обеспечения того, что нет голоса с приоритетом выше, чем текущий счет, если он есть, он должен завершить эту транзакцию, прежде чем выполнять свою собственную - попросите ваших клиентов очистить за тебя :)
Перед запуском счетчик должен быть инициализирован с приоритетом - forge не позволяет вам этого делать, поэтому необходим сценарий-заглушка (до активации проверки!).
источник
напишите облачную функцию и обновите количество узлов.
Обратитесь: https://firebase.google.com/docs/functions/database-events
root-- | | -users (этот узел содержит список всех пользователей) |
| -count | -userscount: (этот узел добавляется динамически облачной функцией с учетом количества пользователей)
источник