Say I have the following structure:
{
"-InSwU2yHOEHwhP_m4_n" : {
".priority" : 0.0,
"name" : "abc"
},
"-InSw_P0j8A-0Njj0Uvf" : {
".priority" : 1.0,
"name" : "def"
}
}
I would like to add another similar item with a guid as a key and priority equals to the number of items currently presented (in this case 2). The result should look something like this:
{
"-InSwU2yHOEHwhP_m4_n" : {
".priority" : 0.0,
"name" : "abc"
},
"-InSw_P0j8A-0Njj0Uvf" : {
".priority" : 1.0,
"name" : "def"
},
"-InSxV-RVkZ07_f3uDnJ" : {
".priority" : 2.0,
"name" : "ghi"
}
}
Note that since multiple clients could try to add such item at the same time, this must be a transaction.
Any ideas?
When you use push()
, each item is assigned a unique ID. So a transaction wouldn't be necessary (there can't be collisions).
If you want the records to be unique by priority (which looks like what you're trying to accomplish) I think you should simply be using the priority as the ID.
Then you can use a transaction to make sure two clients don't push at the same time:
FB.child(path).transaction(function(current_val) {
if( current_val === null ) {
/* set the value here */
}
/* do nothing; transaction fails because it was already written */
}, function(success) {
/* transaction done */
});
However, if you are using the priority as a unique ID, maybe this needs to be rethought; this is really the IDs job and it does a great job; records are also maintained in the order they are inserted so the counter is unnecessary in most cases.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With