Импортируйте большие объемы данных, но сделайте .find () для каждого элемента - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть коллекция клиентов из 60 000 наименований. Мне нужно импортировать список людей из 50.000. Но для каждого человека мне нужно найти идентификатор клиента и добавить его к вставляемому объекту.

Как это сделать наиболее эффективно?

export default async ({ file, user, database }: Request, res: Response) => {
  try {
    const csv = file.buffer.toString("utf8");

    let lines = await CSV({
      delimiter: "auto" // delimiter used for separating columns.
    }).fromString(csv);

    let count = {
      noCustomer: 0,
      fails: 0
    };

    let data: any = [];
    await Promise.all(
      lines.map(async (item, index) => {
        try {

          // Find customer
          const customer = await database
            .model("Customer")
            .findOne({
              $or: [
                { "custom.pipeID": item["Organisasjon - ID"] },
                { name: item["Person - Organisasjon"] }
              ]
            })
            .select("_id")
            .lean();

          // If found a customer
          if (!isNil(customer?._id)) {
            return data.push({
              name: item["Person - Navn"],
              email: item["Person - Email"],
              phone: item["Person - Telefon"],
              customer: customer._id,
              updatedAt: item["Person - Oppdater tid"],
              createdAt: item["Person - Person opprettet"],
              creator: users[item["Person - Eier"]] || "5e4bca71a31da7262c3707c5"
            });
          } 
          else {
            return count.noCustomer++;
          }
        } catch (err) {
          count.fails++;
          return;
        }
      })
    );

    const people = await database.model("Person").insertMany(data)

    res.send("Thanks!")

  } catch (err) {
    console.log(err)
    throw err;
  }
};

Мой код просто никогда не отправляет ответ, если я использую это как Express запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...