Firebase count group by

后端 未结 1 1471
鱼传尺愫
鱼传尺愫 2020-12-30 17:53

Does Firebase supports grouped counting?
I would like to get counting for specific key grouped by the value.

Example of my data structure:

\"         


        
相关标签:
1条回答
  • 2020-12-30 18:06

    Group by is a SQL function. The reason SQL can't do real-time data is because this sort of method does not scale. Mongo provides similar functionality, but once again, it doesn't scale. You may notice a pattern here of why Firebase does not provide this sort of query function.

    It would be extremely helpful if you provided some context of what you're actually attempting to accomplish here, what the rules of the app are, and what approaches you've ruled out, rather than just your presupposed solution of group by. There are probably other, possibly better, alternatives. See the XY problem.

    Here are a couple generic alternatives derived by making sweeping assumptions about your use case.

    Store the totals

    This is the most scalable solution. Store your data as follows:

    /playbacks/$id/<playback data>
    /group_totals/$group/<count>
    

    When writing to playbacks, also update the count for the appropriate group:

    var fb = new Firebase(URL);
    function addPlayback(rec) {
       var ref = fb.child('playbacks').push(rec, function(err) {
          if( err )  throw err;
          incrementCount(rec.data);
       });
    }
    
    function incrementCount(count) {
       fb.child('group_totals/' + count).transaction(function(currentVal) {
         return (currentVal||0)+1;
       });
    }
    

    Now when you want to get the total for a group, you can simply look up the value at group_totals/$group. Similarly, you can store ids for records that belong to each group and utilize that index to grab only the records for a given group.

    Use priorities to fetch and group

    A simpler approach would be to give each record a priority based on the group/data value.

    var fb = new Firebase(URL);
    function addPlayback(rec) {
       rec['.priority'] = rec.data;
       var ref = fb.child('playbacks').push(rec, function(err) {
          if( err )  throw err;
       });
    }
    

    Now to grab a set of records for a given group:

    var fb = new Firebase(URL);
    function getGroup(groupValue, callback) {
       fb.child('playbackPosition').startAt(groupValue).endAt(groupValue).once('value', callback);
    }
    
    function logGroupCount(groupValue, callback) {
       getGroup(groupValue, function(snap) {
           console.log('there are ' + snap.numChildren() + ' items in group ' +groupValue);
       });
    }
    
    0 讨论(0)
提交回复
热议问题