2012-06-18 5 views
5

Nel fare un po 'più di programmazione con Firebase oggi, mi sono trovato che desiderano per un paio di caratteristiche:Esiste (o è stato preso in considerazione) qualcosa come "unione" o "batch" in Firebase?

1) Merge set:

dire che ho un Firebase ref che ha il valore {a:1,b:2,c:3}.

Se faccio qualcosa come ref.set({a:-1,b:-2}) il nuovo valore sarà (non sorprendentemente) {a:-1,b:-2}.

Invece, immagina ref.mergeSet({a:-1,b:-2}) che avrebbe un risultato nel valore del riferimento {a:-1,b:-2,c:3}.

Ora, mi rendo conto che avrei potuto fare qualcosa di simile ref.child("a").set(-1) e ref.child("b").set(-2) per raggiungere questo risultato, ma almeno in alcuni casi, preferisco ottenere solo una singola chiamata al mio .on() gestore.

Questo segue la mia seconda idea.

2) Batch set:

Nella mia domanda mi piacerebbe un modo per forzare un numero arbitrario di chiamate per .set di provocare in una sola chiamata a .on in altri client. Qualcosa di simile:

ref.startBatch() 
ref.child("a").set(1) 
ref.child("b").set(2) 
.... 
ref.endBatch() 

In modalità batch, .set non si tradurrebbe in una chiamata a .on, invece, il numero minimo di chiamate al .on sarebbe tutto frutto di chiamare .endBatch.


ho difficoltà ad ammettere che queste idee sono abbastanza nascente, e io non sarei sorpreso se sono in contraddizione con le caratteristiche architettoniche esistenti di Firebase, ma ho pensato di condividere loro comunque. Trovo che dovrò dedicare più tempo a garantire coerenza tra i client quando utilizzo Firebase di quanto mi aspettassi.

Grazie ancora, e continuate così.

risposta

6

UPDATE: Abbiamo aggiunto un nuovo metodo update() al client Web e il supporto Firebase PATCH al REST API, che permettono di modificare atomicamente più fratelli in una particolare posizione, lasciando gli altri fratelli non modificato. Questo è ciò che lei ha descritto come "mergeSet" e può essere utilizzato come segue:

ref.update({a: -1, b: -2}); 

che aggiornerà 'a' e 'b', ma lasciare 'c' non modificato.


risposta Old

Grazie per il dettaglio di richiesta di funzionalità! Ci piacerebbe saperne di più sul tuo caso d'uso e su come questi primitivi ti aiuterebbero. Se sei disposto a condividere ulteriori dettagli, invia un'email a [email protected] e possiamo analizzare il tuo scenario.

Per rispondere alla tua domanda, la ragione principale per cui non disponiamo di queste funzionalità è legata alla nostra architettura e alle garanzie di prestazioni/consistenza che stiamo cercando di mantenere. Non andare troppo in profondità, ma se immagini che i tuoi dati Firebase si diffondono su molti server, è più facile per noi avere maggiori garanzie (atomicità, ordini, ecc.) Quando modifichi i dati che sono vicini nell'albero piuttosto che quando modifichi i dati che sono lontani lontano. Quindi, limitando queste garanzie ai dati che è possibile sostituire con una singola chiamata set(), ti spingiamo in una direzione che si comporterà bene con l'architettura Firebase.

In alcuni casi, potresti riuscire a ottenere più o meno ciò che desideri semplicemente riorganizzando il tuo albero. Ad esempio, se sai che vuoi sempre impostare "a" e "b" insieme, puoi metterli sotto un comune "ab" genitore e fare ref.child('ab').set({a:-1, b:-2});, che non avrà effetto sul figlio "c".

Come ho detto, ci piacerebbe sapere di più sul tuo scenario. Siamo in beta, così possiamo imparare dagli sviluppatori come stanno usando l'API e dove sta cadendo! [email protected] :-)