如何(快速)在Firebase中下载大量数据?

时间:2019-02-01 02:29:49

标签: javascript firebase csv google-cloud-firestore google-cloud-functions

我正在以33Hz的频率向Firestore发送数据。这意味着随着时间的流逝,会存储大量数据。

我需要能够下载此数据。为此,我在firebase中创建了一个Http函数,该函数接收用户uid,设备的序列号,开始日期/时间和结束日期/时间。然后,该功能将测试用户是否存在以及用户是否确实具有该序列号。然后,它查询firestore并将数据附加到JSON对象,该对象最终作为响应发送。

但是,取决于查询进行了多长时间,该函数将超时。它确实可以在短时间内工作。

如何使该功能更快?我使用了错误的工具吗?

[...]
const nD1 = db.collection('grind-bit').doc(req.query.serial).collection('history').where('date', '>=', startdate).where('date', '<=', enddate).get().then(snapshot => {
  snapshot.forEach(doc => {
    elem = {};
    elem.date = doc.data().date;
    elem.rms0 = doc.data().rms0;
    elem.rms1 = doc.data().rms1;
    elem.rms2 = doc.data().rms2;
    data[key].push(elem);
  });
  if(data[key].length) {
    let csv = json2csv(data[key]);
    csv = JSON.stringify(csv);
    res.set("Content-Type", "text/csv");
    return promises.push(res.status(200).send(csv));
  } else {
    return promises.push(res.status(401).send('No data has been found in this interval.'));
  }
[...]

1 个答案:

答案 0 :(得分:0)

如果超时是由于您试图一次读取/返回太多数据而导致的,则可能需要考虑限制返回的数据量。通过在查询中添加limit()子句,可以限制查询最多返回多少数据。

const nD1 = db.collection('grind-bit').doc(req.query.serial).collection('history')
.where('date', '>=', startdate).where('date', '<=', enddate)
.limit(100)
.get().then(snapshot => {
  snapshot.forEach(doc => {
    ...

这当然意味着您可能必须多次调用HTTP函数以确保您处理所有数据。最简单的方法是:如果您得到100个结果(或您指定的任何限制),请在处理它们后再试一次。

另请参阅: