2012-06-18 9 views
5

In etwas mehr Programmierung mit Firebase zu tun heute, fand ich mich für ein paar Funktionen wünschen:Gibt es in Firebase eine Einstellung wie "Zusammenführen" oder "Stapelverarbeitung"?

1) Merge Satz:

sagen, dass ich ein Feuerbasis ref haben, die den Wert {a:1,b:2,c:3} hat.

Wenn ich etwas wie ref.set({a:-1,b:-2}) mache, wird der neue Wert (nicht überraschend) {a:-1,b:-2} sein.

Stellen Sie sich statt dessen ref.mergeSet({a:-1,b:-2}) vor, was zu einem Wert von {a:-1,b:-2,c:3} führen würde.

Jetzt merke ich, dass ich so etwas wie ref.child("a").set(-1) und ref.child("b").set(-2) tun könnte, um dieses Ergebnis zu erreichen, aber zumindest in einigen Fällen, würde ich es vorziehen, nur einen einzigen Anruf zu meinem .on() Handler zu bekommen.

Dies geht in meine zweite Idee.

2) Batch Satz:

In meiner Anwendung ich einen Weg möchte, eine beliebige Anzahl von Anrufen zu .set nur in einem Aufruf zu .on in anderen Clients führen zu erzwingen. Etwas wie:

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

Im Batch-Modus .set nicht in einem Aufruf von .on führen würde, stattdessen die minimale Anzahl der Anrufe an .on würde alle resultieren aus .endBatch aufrufen.


Ich gebe gerne zu, dass diese Ideen ziemlich die Entwicklung begriffen sind, und ich wäre nicht überrascht, wenn sie mit dem bestehenden architektonischen Besonderheiten von Firebase in Konflikt geraten, aber ich dachte, dass ich sie trotzdem teilen würde. Ich stelle fest, dass ich mehr Zeit aufwenden muss, um die Konsistenz zwischen den Clients sicherzustellen, wenn ich Firebase verwende, was ich erwartet habe.

Nochmals vielen Dank, und weiter so gute Arbeit.

Antwort

6

UPDATE: Wir haben eine neue update() -Methode auf die Firebase Webclient und PATCH Unterstützung der REST API hinzugefügt, die es Ihnen ermöglichen, atomar mehrere Geschwister an einer bestimmten Stelle zu ändern, während die anderen Geschwister unmodifizierten verlassen. Dies ist, was man als „mergeSet“ beschrieben und kann wie folgt verwendet werden:

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

, die aktualisiert ‚a‘ und ‚b‘, aber lassen ‚c‘ unverändert.


ALTE ANTWORT

Danke für die ausführliche Feature-Anfrage! Wir würden gerne mehr über Ihren Anwendungsfall erfahren und wie diese Primitiven Ihnen helfen würden. Wenn Sie weitere Details teilen möchten, senden Sie eine E-Mail an [email protected] und wir können uns in Ihr Szenario einarbeiten.

Um Ihre Frage zu beantworten, ist der Hauptgrund, warum wir diese Funktionen nicht haben, unsere Architektur und die Leistung/Konsistenz, die wir zu erhalten versuchen. Nicht zu tief gehen, aber wenn Sie sich vorstellen, dass Ihre Firebase-Daten über viele Server verteilt sind, ist es einfacher für uns, stärkere Garantien (Atomizität, Reihenfolge usw.) zu haben, wenn Daten in der Baumstruktur geändert werden, als wenn Daten weit entfernt sind Weg. Indem Sie diese Garantien auf Daten beschränken, die Sie durch einen einzigen Aufruf von set() ersetzen können, führen wir Sie in eine Richtung, die mit der Firebase-Architektur gut funktioniert.

In einigen Fällen können Sie möglicherweise grob erreichen, was Sie wollen, indem Sie Ihren Baum einfach reorganisieren. Zum Beispiel, wenn Sie wissen, dass Sie immer 'a' und 'b' zusammen setzen möchten, können Sie sie unter einen gemeinsamen 'ab' Elternteil setzen und ref.child('ab').set({a:-1, b:-2}); machen, was das 'c' Kind nicht betrifft.

Wie gesagt, wir würden gerne mehr über Ihr Szenario erfahren. Wir sind in der Beta-Phase, damit wir von Entwicklern erfahren können, wie sie die API nutzen und wo sie untergeht! [email protected] :-)