Задать вопрос
olhapi
@olhapi
front-end

Почему присваивается одинаковый ID элементам?

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);
  }
})();
  • Вопрос задан
  • 122 просмотра
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы