如何从Firebase中的特定路径数组获取数据?

时间:2018-11-17 12:29:35

标签: javascript firebase firebase-realtime-database

我现在正在处理日期,并且我这样构造数据库:

database[userId][work][year][month][date]

因此,如果我想获取用户的工作时间,请在特定日期致电:

const getWorkData = (userId, year, month, date, callback) => {
    usersRef.child(`${userId}/work/${year}/${month}/${date}`).on("value", snap =>
        callback(snap.val())
    )
}

如果我只需要一个日期的数据,则此功能可以完美运行。但我想向用户显示整整一周的数据。问题来了。

我有两种可能的解决方案,但都不可行。

//loop through an array of the week's dates

const weeksDates = [
  {year: 2018, month: 11, date: 12},
  {year: 2018, month: 11, date: 13},
  {year: 2018, month: 11, date: 14},
  {year: 2018, month: 11, date: 15},
  {year: 2018, month: 11, date: 16},
  {year: 2018, month: 11, date: 17},
  {year: 2018, month: 11, date: 18},
];

const userId = "userId";
const getWorkData = (userId, year, month, date, callback) => {
    usersRef.child(`${userId}/work/${year}/${month}/${date}`).on("value", snap =>
        callback(snap.val())
    )
}

//loop through the dates, and fetch data at each date

const getWorkDataOfWeek = (userId, weeksDates) => {
  const data = [];
  const pushToData = value => data.push(value)
  weeksDates.forEach(dateObj => {
    const { year, month, date } = dateObj;
    getWorkData(userId, year, month, date, pushToData)
  })
}

//fetch the whole database, and filter it

const getWorkDataOfWeek = (userId, weeksDates, callback) => {
  usersRef.child(userId).on("value", snap => {
    const workData = snap.val();
    const data = weeksDates.map(dateObj => {
      const { year, month, date } = dateObj;
      return workData[year][month][date];
    })
    callback(data)
  })
}

第一种方法的问题是它创建了太多请求。第二个问题是它请求的数据量太大。除了仅请求一次之外,firebase是否有类似于第一个的解决方案?

1 个答案:

答案 0 :(得分:1)

像Firebase这样的对象数据库的原理是能够按照您想要的方式来安排数据,并且将来需要使用它。这样可以防止在检索数据时增加CPU负载,等等,您可以通过执行非规范化来实现。这意味着您可以预期将如何需要数据并进行写回。因此,您需要按周和按日期的数据,请首先将数据写成周和日期。

类似这样的东西:

/ UID /年/月/日 / UID /年/周/日期。 (您应该已经知道那周是12、13 ...)

有了Firebase,一次使用多个路径更新就可以很容易地将数据保存在多个路径上。

有关非规范化的文章:https://firebase.googleblog.com/2013/04/denormalizing-your-data-is-normal.html

有关多路径更新的文章:https://medium.com/@danbroadbent/firebase-multi-path-updates-updating-denormalized-data-in-multiple-locations-b433565fd8a5

P.S。我还要补充一点,在我看来,您只想在需要时才读取该数据,因此请使用一次,而不要使用。