2017-08-07 42 views
0

我正試圖找到一種方法來迭代Firebase數據庫中大量數據集合中的所有對象。我是否正確地分析了一個巨大的Firebase集合?

我最好的嘗試如下,但我發現很奇怪的幾個原因:

  1. startAt()值總是包容。因此,在獲取100個元素後,我必須使用我最後一次提取的密鑰作爲參數startAt,這導致最後一個項目被再次提取
  2. DataSnapshotforEach方法不允許使用索引計數進行回調它將基於JS的標準,所以我不得不創建一個手動指標 - 不知道它會在任何情況下工作,因爲我不知道是否forEach作品完美地同步

這裏是我的代碼,如果假定我的收藏位於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 
     } 
    }) 
    }) 
} 

,我怎麼能做出這樣的方法更優雅的任何想法?

回答

1
  1. Firebase查詢的開始和結束條件都包含在內。您確實必須在客戶端上重複刪除重疊項目。

  2. 火力地堡的Snapshot.forEach()是同步操作。

我通常會根據已有項目的關鍵字進行重複數據刪除。這也將消除對idx計數器的需求。

snapshot.forEach((childSnapshot) => { 
    if (lastChildKey !== childSnapshot.key) { 
    childrenPromises.push(childSnapshotCallback(childSnapshot)) 
    } 
    lastChildKey = childSnapshot.key 
}) 
相關問題