arrays - data - firestore push to array
¿Cómo manejar arreglos vacíos en Firebase? (2)
Usualmente uso la función DataSnapshot numChildren () para ver si está vacía o no, como esta
var fire = new Firebase("https://example.firebaseio.com/");
fire.once(''value'', function(data){if (data.numChildren() > 0){ /*Do something*/ });
Supongamos que una person
puede tener varios cars
y que el car
puede tener múltiples accidents
. Entonces podríamos tener:
# Person with no cars
person:
name: "Misha"
cars: []
# Person with free-accident car
person:
name "Arlen"
cars:
0:
name: "Toyota"
accidents: []
Firebase almacena a estas personas como:
person:
name: "Misha"
y
person:
name "Arlen"
cars:
0:
name: "Toyota"
Entonces en JavaScript tengo que hacer lo siguiente para restaurar las matrices vacías: (CoffeeScript)
if person.cars?
for car in person.cars
car.accidents = [] unless car.accidents?
else
person.cars = []
¿Existe alguna forma mejor de manejar matrices vacías en Firebase sin escribir este código JavaScript innecesario?
Creo que si entiendo la pregunta principal, la respuesta corta es que no hay forma de forzar una matriz vacía en Firebase. Sin embargo, hay algunos paradigmas que podrían funcionar mejor que los que tienes arriba.
Ten en cuenta que Firebase es un entorno en tiempo real. El número de automóviles y accidentes puede (y cambiará) en cualquier momento. Lo mejor es tratar todo como nuevos datos que llegan en tiempo real y evitar siquiera pensar acerca de si existe o no existe.
// fetch all the people in real-time
rootRef.child(''people'').on(''child_added'', function(personSnapshot) {
// monitor their cars
personSnapshot.ref().child(''cars'', ''child_added'', function(carSnapshot) {
// monitor accidents
carSnapshot.ref().child(''accidents'', ''child_added'', function(accidentSnapshot) {
// here is where you invoke your code related to accidents
});
});
});
Tenga en cuenta que no es necesario if exists/unless
escriba la lógica. Tenga en cuenta que probablemente también desee supervisar child_removed
en cars
y people
y llame a ref.off()
para dejar de escuchar a niños específicos.
Si por alguna razón quieres mantenerte con el modelo estático, entonces paraEach se convertirá en tu amigo:
// fetch all the people as one object, asynchronously
// this won''t work well with many thousands of records
rootRef.child(''people'').once(''value'', function(everyoneSnap) {
// get each user (this is synchronous!)
everyoneSnap.forEach(function(personSnap) {
// get all cars (this is asynchronous)
personSnap.ref().child(''cars'').once(''value'', function(allCars) {
// iterate cars (this is synchronous)
allCars.forEach(function(carSnap) { /* and so on */ });
});
});
});
Observe cómo, incluso con forEach, no es necesario el tipo de lógica "existe o no existe".