Я изучаю машинопись / javascript и изучаю функциональное программирование. Вполне возможно, что некоторый код здесь может показаться неправильным для опытных javascript программистов. Так что в основном я пытаюсь
- передать удаленный файл - я использую got
- конвертировать каждый CSV в json - я использую csvto json
- На этом этапе я могу по отдельности писать в mongodb, но это неэффективно, поэтому я собираю это в переменную 5000 json объектов и затем записываю в базу данных. - Я использую mon goose
Мне не нравится эта глобальная переменная, и, безусловно, есть лучший способ сделать то, что я делаю. Кроме того, поскольку данные не всегда кратны 5000, у меня могут быть строки, которые не были записаны. Мне тоже нужно это исправить. Спасибо.
import csv from "csvtojson";
import got from "got";
import { CountyDocument, County } from "../models/County";
import logger from "../util/logger";
import {BulkWriteOpResultObject} from "mongodb";
const writetoDataBase = (data: any,): Promise<BulkWriteOpResultObject> => {
return County.bulkWrite(data);
};
let collect: Array<CountyDocument> = [];
function processIndividualRecord(data: CountyDocument, linenumber: number) {
let prom;
if (linenumber !== 0 && linenumber % 5000 === 0) {
const copyarray = collect.map(x => {
const upsertDoc = {
updateOne: {
filter: { county: x.county, date: x.date, state: x.state },
update: { cases: x.cases, deaths: x.deaths, fips: x.fips },
upsert: true
}
};
return upsertDoc;
});
prom = writetoDataBase(copyarray).then(value => {
logger.debug(`writing to DB at ${linenumber}`);
});
collect = [];
} else {
collect.push(data);
prom = Promise.resolve();
}
return prom;
};
export const saveschedule = () => {
return csv().fromStream(got.stream(<some url>))
.subscribe(processIndividualRecord, (err: CSVError) => {
logger.error(`error processing the rows ${err.message} and the stack is ${err.stack}`);
process.exit(1);
}, () => {
logger.info("DONE");
});
};