Skip to content

Instantly share code, notes, and snippets.

@katowulf
Last active September 21, 2023 20:28
Show Gist options
  • Save katowulf/6383103 to your computer and use it in GitHub Desktop.
Save katowulf/6383103 to your computer and use it in GitHub Desktop.
Get only new items from Firebase
// assumes you add a timestamp field to each record (see Firebase.ServerValue.TIMESTAMP)
// pros: fast and done server-side (less bandwidth, faster response), simple
// cons: a few bytes on each record for the timestamp
var ref = new Firebase(...);
ref.orderByChild('timestamp').startAt(Date.now()).on('child_added', function(snapshot) {
console.log('new record', snap.key());
});
// pros: works?
// cons: fetches entire record set, requires discarding the first record
// credits: http://stackoverflow.com/questions/12850789/is-there-a-way-to-know-in-what-context-child-added-is-called-particularly-page/12851236#12851236
var ref = new Firebase(...);
ref.once("value", function(snap) {
//TODO: display initial state...
// Object.keys not supported in IE 8, but has a polyfill: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
var keys = Object.keys(snap.val()||{});
var lastIdInSnapshot = keys[keys.length-1]
ref.orderByKey().startAt(lastIdInSnapshot).on("child_added", function(newMessSnapshot) {
if( snap.key() === lastIdInSnapshot ) { return; }
console.log('new record', snap.key());
}
}
// pros: does not fetch entire record set
// cons: triggers child_removed events when last item changes, grabs the last record which needs to be ignored
var first = true;
var ref = new Firebase(...);
ref.limitToLast(1).on("child_added", function(snap) {
if( first ) {
first = false;
}
else {
console.log('new record', snap.key());
}
});
@ctf0
Copy link

ctf0 commented Jul 26, 2019

dont forget to add an index for the timestamp to make the filtration quicker https://www.firebase.com/docs/security/guide/indexing-data.html

@Pushpavel
Copy link

Pushpavel commented Aug 24, 2020

This is also one solution,
ref.startAt(null,ref.push().key).on('child-added,...'
works only when keys are generated by push()

@nwparker
Copy link

This is also one solution,
ref.startAt(null,ref.push().key).on('child-added,...'
works only when keys are generated by push()

This is interesting, do you know why this works? Are keys generated in order by RTDB?

@SrBrahma
Copy link

SrBrahma commented Oct 9, 2020

On 2), ref.orderByKey().startAt(lastIdInSnapshot).on("child_added"..., I found out that instead of throwing away the first value, you can add a '-' to the lastIdSnapshot. It's just an character with a low ASCII value, so any push'ed item will go after the previous one + '-'.

@Pushpavel
Copy link

Pushpavel commented Oct 10, 2020

This is interesting, do you know why this works?

if we were to use ref.push().key to put a new entry on ref, it would be stored as the last child.So, using second parameter of startAt function, we retrive childs with key greater than or equal to ref.push().key
https://firebase.google.com/docs/reference/js/firebase.database.Query#startat

Are keys generated in order by RTDB?

yes, https://firebase.google.com/docs/database/admin/save-data#push-vs-transaction

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment