В Firebase существует ли способ получить число дочерних узлов узла без загрузки всех данных узла?

Вы можете получить счет ребенка через

firebase_node.once('value', function(snapshot) { alert('Count: ' + snapshot.numChildren()); }); 

Но я считаю, что это извлекает все подэлемент этого узла с сервера. Для огромных списков это кажется оперативной памятью и латентностью. Есть ли способ получить счет (и / или список дочерних имен), не выбирая все это?

    Фрагмент кода, который вы дали, действительно загружает весь dataset и затем подсчитывает его на стороне клиента, что может быть очень медленным для больших объемов данных.

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

    На данный момент одним из решений было бы поддерживать счетчик числа детей и обновлять его каждый раз, когда вы добавляете нового ребенка. Вы можете использовать транзакцию для подсчета элементов, например, в этом коде отслеживания:

     var upvotesRef = new Firebase('https://docs-examples.firebaseio.com/android/saving-data/fireblog/posts/-JRHTHaIs-jNPLXOQivY/upvotes'); upvotesRef.transaction(function (current_value) { return (current_value || 0) + 1; }); 

    Для получения дополнительной информации см. https://www.firebase.com/docs/transactions.html

    UPDATE: Firebase недавно выпустила функции Cloud. С облачными функциями вам не нужно создавать собственный сервер. Вы можете просто написать функции JavaScript и загрузить его в Firebase. Firebase будет отвечать за запуск функций всякий раз, когда происходит событие.

    Если вы хотите, например, подсчитать верхние позиции, вы должны создать структуру, аналогичную этой:

     { "posts" : { "-JRHTHaIs-jNPLXOQivY" : { "upvotes_count":5, "upvotes" : { "userX" : true, "userY" : true, "userZ" : true, ... } } } } 

    А затем напишите функцию javascript, чтобы увеличить upvotes_count когда есть новая запись в узел upvotes .

     const functions = require('firebase-functions'); const admin = require('firebase-admin'); admin.initializeApp(functions.config().firebase); exports.countlikes = functions.database.ref('/posts/$postid/upvotes').onWrite(event => { return event.data.ref.parent.child('upvotes_count').set(event.data.numChildren()); }); 

    Вы можете прочитать документацию, чтобы знать, как начать работу с облачными функциями .

    Кроме того, здесь приведен пример других учетных записей: https://github.com/firebase/functions-samples/blob/master/child-count/functions/index.js

    Это немного поздно в игре, так как некоторые другие уже хорошо ответили, но я расскажу, как я могу ее реализовать.

    Это зависит от того, что API REST Firebase предлагает параметр « shallow=true .

    Предположим, что у вас есть объект post и каждый может иметь несколько comments :

     { "posts": { "$postKey": { "comments": { ... } } } } 

    Вы, очевидно, не хотите получать все комментарии, просто количество комментариев.

    Предполагая, что у вас есть ключ к сообщению, вы можете отправить запрос GET на https://yourapp.firebaseio.com/posts/[the post key]/comments?shallow=true .

    Это вернет объект пар ключ-значение, где каждый ключ является ключом комментария, и его значение true :

     { "comment1key": true, "comment2key": true, ..., "comment9999key": true } 

    Размер этого ответа намного меньше, чем запрос эквивалентных данных, и теперь вы можете рассчитать количество ключей в ответе, чтобы найти свое значение (например, commentCount = Object.keys(result).length ).

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

    Сохраните счет, когда вы идете, и используйте проверку, чтобы обеспечить его соблюдение. Я взломал это вместе – за счет подсчета уникальных голосов и подсчетов, которые продолжают расти! Но на этот раз я опробовал свое предложение! (несмотря на ошибки вырезания / вставки!).

    «Трюк» здесь заключается в том, чтобы использовать приоритет узла для подсчета голосов …

    Данные:

    vote / $ issueBeingVotedOn / user / $ uniqueIdOfVoter = thisVotesCount, priority = thisVotesCount vote / $ issueBeingVotedOn / count = ‘user /’ + $ idOfLastVoter, priority = CountofLastVote

     ,"vote": { ".read" : true ,".write" : true ,"$issue" : { "user" : { "$user" : { ".validate" : "!data.exists() && newData.val()==data.parent().parent().child('count').getPriority()+1 && newData.val()==newData.GetPriority()" 

    пользователь может голосовать только один раз. && count должно быть больше, чем текущее значение count && данных должно быть таким же, как и приоритет.

      } } ,"count" : { ".validate" : "data.parent().child(newData.val()).val()==newData.getPriority() && newData.getPriority()==data.getPriority()+1 " } 

    count (последний избиратель действительно) – голосование должно существовать, а его счет равен newcount, && newcount (priority) может увеличиться только на один.

      } } 

    Тестовый скрипт, чтобы добавить 10 голосов разными пользователями (для этого примера, поддельные id, должен пользователь auth.uid в производстве). Подсчитайте (i–) 10, чтобы убедиться, что проверка не выполнена.

       -   

    «Риск» здесь заключается в том, что голосование проводится, но счет не обновляется (сбой или сбой сценария). Вот почему голоса имеют уникальный «приоритет» - сценарий должен действительно начинаться с того, что нет голоса с приоритетом выше текущего счета, если он должен завершить эту транзакцию, прежде чем делать это самостоятельно - попросите своих клиентов очистить для вас 🙂

    Счет нужно инициализировать с приоритетом, прежде чем вы начнете - forge не позволяет вам это делать, поэтому необходим скрипт-заглушка (до того, как валидация будет активна!).

    написать функцию облака и обновить счет узла.

     // below function to get the given node count. const functions = require('firebase-functions'); const admin = require('firebase-admin'); admin.initializeApp(functions.config().firebase); exports.userscount = functions.database.ref('/users/') .onWrite(event => { console.log('users number : ', event.data.numChildren()); return event.data.ref.parent.child('count/users').set(event.data.numChildren()); }); 

    См. https://firebase.google.com/docs/functions/database-events

    root– | | -sers (этот узел содержит список всех пользователей) |
    | -count | -userscount: (этот узел динамически добавляется функцией облака с подсчетом пользователя)

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

    Предоставлен метод DataSnapshot.numChildren (), более подробную информацию можно найти здесь – Firebase Website

    Давайте будем гением компьютера.