Функции Firebase + Firestore: Очереди очереди - PullRequest
0 голосов
/ 24 февраля 2019

Я все еще новичок в Firestore и, честно говоря, я программирую всего несколько месяцев.Я узнал (или, скорее, учусь) это, чтобы я мог лучше управлять своим бизнесом с SIM-картами, который имеет дело с большим количеством CSV, содержащих много данных.

Я использую метод пакетной записи, чтобы установить данные в мою базу данных firestore, и я делаю это в облачной функции (index.ts).Это не позволит мне вставлять более 500 записей одновременно, что является пределом для Firestore.Любой совет, как я могу каким-то образом разделить мои данные на куски по 500, а затем выполнить пакетную фиксацию для каждой из них, без необходимости вручную отправлять и загружать 500 за раз?

Мои CSV-файлы обычно имеют длину от 100 до 200 тыс. Строк.Я также использую облачную функцию для чтения CSV, когда он загружен в хранилище Firebase.Я хотел бы сделать это как часть функции Cloud, а не полагаться на сторонний сплиттер CSV.

import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
import { tmpdir } from 'os';
import { join, dirname } from 'path';
import * as fs from 'fs-extra';
import * as storage from '@google-cloud/storage';
const gcs = new storage.Storage();
import * as papa from 'papaparse';

admin.initializeApp();

export const generateThumbs = functions.storage
  .object()
  .onFinalize(async object => {
    console.log('Version 19');
    const bucket = gcs.bucket(object.bucket);
    const filePath = object.name;
    const fileName = filePath.split('/').pop();
    const bucketDir = dirname(filePath);
    console.log(bucketDir);

    const workingDir = join(tmpdir(), 'thumbs');
    const tmpFilePath = join(workingDir, fileName);

    if (fileName.includes('thumb@')) {
      console.log('exiting function');
      return false;
    }

    // 1. Ensure dir exists
    await fs.ensureDir(workingDir);

    // 2. Download Source File
    await bucket.file(filePath).download({
      destination: tmpFilePath
    });

    const theFile = fs.createReadStream(tmpFilePath);

    var arrayOfData = []

    papa.parse(theFile, {
      worker: true, // Don't bog down the main thread if its a big file
      header: true,
      delimiter: ",",
      step: function(result) {
        // console.log(result.data, 'Result');
        arrayOfData.push(result.data)
        // do stuff with result


      },
      complete: function(results, theFile) {
        var simLength = arrayOfData.length;

        const db = admin.firestore(); 
        const batch = db.batch();


        for (var i = 0; i < simLength;i++) {
          const simArray = arrayOfData[i];
          const sim = simArray[0];
          var iccid = sim.iccid;
          const vcRef = db.collection('vc_uploads').doc(iccid);

          batch.set(vcRef, {simArray})

        }
        return batch.commit().then(function() {
          console.log('Batch Committed!')
        });

      }
    });

    // 5. Cleanup remove the tmp/thumbs from the filesystem
    return fs.remove(workingDir);
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...