Ответ 1
Я думаю, что, если я понимаю основной вопрос, короткий ответ заключается в том, что нет способа заставить пустой массив в Firebase. Однако есть некоторые парадигмы, которые могут работать лучше, чем то, что у вас есть.
Имейте в виду, что Firebase - это среда реального времени. Количество автомобилей и несчастных случаев может (и будет) изменяться в любое время. Лучше всего рассматривать все, поскольку новые данные поступают в реальном времени и избегают даже думать о существовании или не существует.
// 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
});
});
});
Обратите внимание, что нет необходимости в логике типа if exists/unless
. Обратите внимание, что вы, вероятно, также хотите отслеживать child_removed
на cars
и people
и вызывать ref.off()
, чтобы прекратить прослушивание определенных детей.
Если по какой-то причине вы хотите придерживаться статической модели, то forEach станет вашим другом:
// 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 */ });
});
});
});
Обратите внимание, что даже с forEach нет необходимости в логике "существует или не существует".