recorrer firestore data array arrays firebase

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".