Я все еще новичок в 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);
});