Ich versuche einen Weg zu finden, alle Objekte aus einer großen Datensammlung in Firebase Database zu iterieren.Paginiere ich durch eine riesige Firebase-Sammlung richtig?
Mein bester Versuch folgt, aber ich fand es seltsam, aus mehreren Gründen:
startAt()
Werte sind immer inklusive. Nach dem Holen von 100 Elementen musste ich meinen letzten abgerufenen Schlüssel als Argument fürstartAt
verwenden, was dazu führt, dass das letzte Element wieder abgerufen wird.- Die
forEach
Methode erlaubt keinen Rückruf mit einer Indexzählung, wie Sie denken würden es würde auf Basis von JS Standards, damit ich einen manuellen Index erstellen hatte - nicht sicher, dass es in jedem Fall arbeiten, wie ich bin nicht sicher, obforEach
funktioniert perfekt synchron
Hier ist mein Code, unter der Annahme, meine Sammlung befindet sich unter users
.
const mapAllTripsPaginated = function (database, childSnapshotCallback, start = '', limit = 100, totalNb = 0) {
return database.ref('/users').orderByKey().startAt(start).limitToFirst(limit).once('value').then((snapshot) => {
let childrenPromises = []
let lastChildKey = null
let idx = 0
snapshot.forEach((childSnapshot) => {
lastChildKey = childSnapshot.key
if (start !== '' && idx === 0) {
// console.log(`Skipping ${childSnapshot.key} as 1st element of page`)
} else {
childrenPromises.push(childSnapshotCallback(childSnapshot))
}
idx = idx + 1
})
return Promise.all(childrenPromises)
.then((result) => {
let newTotal = totalNb + result.length
if (snapshot.numChildren() === limit) {
console.log(`Paginating from ${lastChildKey}`)
return mapAllTripsPaginated(database, childSnapshotCallback, start = lastChildKey, limit = limit, totalNb = newTotal)
} else {
// Done paginating
return newTotal
}
})
})
}
Irgendeine Idee, wie ich diese Methode eleganter machen könnte?