xml-stream парсит файл и отдает его по объектам. Объекты эти нужно записать в базу. Чтобы сделать это быстрее я кэширую каждые 100 объектов и записываю в БД когда их собралось 100. По факту же объектам присваиваются одинаковые ID, даже если для генерации ID использовать nanoid, а не брать их из xml файла (где они тоже уникальны). Почему так происходит и как это исправить?
const fs = require("fs");
const XmlStream = require("xml-stream");
const MongoClient = require("mongodb").MongoClient;
(async function() {
const client = new MongoClient("mongodb://localhost:27017");
try {
await client.connect();
console.log("Connected correctly to server");
const db = client.db("opendata");
const stream = fs.createReadStream("./data/edrpou.xml");
const xml = new XmlStream(stream);
let countAll = 0;
let countNonObjNonEdrpou = 0;
let tmpBatch = [];
xml.on("endElement: SUBJECT", async function(data) {
try {
if (data instanceof Object && data.EDRPOU) {
delete data["$"];
data._id = data.EDRPOU;
if (tmpBatch.length > 100) {
tmpBatch.push(data);
await db.collection("organization").insertMany(tmpBatch);
tmpBatch = [];
} else {
tmpBatch.push(data);
}
} else {
countNonObjNonEdrpou++;
}
countAll++;
console.clear();
console.log(" ", countAll);
console.error("!object & !edrpou objects: ", countNonObjNonEdrpou);
} catch (error) {
throw new Error(error);
}
});
xml.on("end", function() {
console.error("!object & !edrpou objects: ", countNonObjNonEdrpou);
console.log(" END");
// Close connection
client.close();
});
} catch (err) {
console.log(err.stack);
}
})();