Skip to content

Instantly share code, notes, and snippets.

@davideast
Last active April 20, 2021 17:18
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 6 You must be signed in to fork a gist
  • Save davideast/f54869dac86ad0715633 to your computer and use it in GitHub Desktop.
Save davideast/f54869dac86ad0715633 to your computer and use it in GitHub Desktop.
Bulk update with .push()
/**
* Send a bulk update to Firebase from an array or an object literal.
*
* When .push() is called on a Firebase reference without a parameter passed no
* trip to the server is made.
*
* ex:
* var childRef = ref.push();
*
* A reference is returned which has a push-id that can be returned by calling .name().
* Because of this, we can create an object with push-ids as keys and send to Firebase
* with one .set() method.
*
* This function takes in a Firebase reference and a collection to bulk update. The
* colleciton can either be an Array or an Object. If an Object is used, its keys
* are ignored and push-ids are used instead.
*
* @param {Firebase Reference} ref
* @param {Array or Object} collection
* @returns a Promise that is fulfilled through the onComplete argument
*/
function bulkUpdate(ref, collection) {
// object to hold the bulk update
var batch = {};
// Using a ES6 promise here, use a library or polyfil for compatibility
var deferred = Promise.defer();
// using Object.keys will allow us to iterate over an array or object
Object.keys(collection).forEach(function(key) {
// get the push id from the child reference, no server trip is made here
var pushId = ref.push().key();
// get the value from the collection
var itemValue = collection[key];
// using the pushId, assign the value to the bulk update object
batch[pushId] = itemValue;
});
// send the bulk update to Firebase
ref.update(batch, function onComplete(arg) {
// if the argument is null then it's a successful update
if(arg === null) {
deferred.resolve(arg);
} else {
// if the argument is not null then it is an error
deferred.reject(arg);
}
});
return deferred.promise;
}
// example:
var ref = new Firebase('https://<your-firebase>.firebaseio.com/items');
var itemArray = ['Hello', 'World'];
bulkUpdate(ref, itemArray).then(function(arg) {
console.log(arg);
}).catch(function(error) {
console.error(error);
});
var itemObj = {
'item1': 'Hello',
'item2': 'World'
};
// This will only send the values and ignore the keys
bulkUpdate(ref, itemObj).then(function(arg) {
console.log(arg);
}).catch(function(error) {
console.error(error);
});
@alexbjorlig
Copy link

Great demo. But you don't need to wrap the firebase update function in a promise, the functions now returns a promise thus the code can be simplified..

@octalmage
Copy link

This is awesome, thanks!

@pawar-aniket
Copy link

Awesome snippet ! Thanks !

@sabinbajracharya
Copy link

On Line number 31 of bulkUpdate.js, key is not a function anymore, so it's var pushId = ref.push().key;

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