Есть ли способ ускорить объединение при обработке большого количества данных? - PullRequest
0 голосов
/ 06 июня 2018

Я использую mongo и nodejs.

В настоящее время у меня есть следующие коллекции:

entryMore {
entryId
...
}

filesize {
entryId
...
}

entryIam {
entryId
...
}

entryStatus {
entryId
...
}

entryPubStatus {
entryId
....
}

Все они отображаются один на один с entryId

Я присоединяюсьвсе коллекции в nodejs со следующим кодом

// db
const { MongoClient } = require('mongodb');
const fs = require('fs');
const Json2csvParser = require('json2csv').Parser;


// run catch err
run()
  .catch(error => console.error(error.stack));


async function run() {
  // connect
  const client = await MongoClient.connect('mongodb://user:pass@127.0.0.1:27017');

  // db
  const db = client.db('kal');

  // The only way to use `$lookup` in MongoDB 3.2 and 3.4
  const docs = await db.collection('entryMore').aggregate([

    // filesize
    {
      $lookup: {
        from: 'filesize',
        localField: 'entryId',
        foreignField: 'entryId',
        as: 'filesize'
      }
    },
    {
      // deconstruct and map to one by one
      $unwind: '$filesize'
    },

    // Iam
    {
      $lookup: {
        from: 'entryIam',
        localField: 'entryId',
        foreignField: 'entryId',
        as: 'entryIam'
      }
    },
    {
      $unwind: '$entryIam'
    },

    // entry status
    {
      $lookup: {
        from: 'entryStatus',
        localField: 'entryId',
        foreignField: 'entryId',
        as: 'entryStatus'
      }
    },
    {
      $unwind: '$entryStatus'
    },

    // pub status
    {
      $lookup: {
        from: 'entryPubStatus',
        localField: 'entryId',
        foreignField: 'entryId',
        as: 'entryPubStatus'
      }
    },
    {
      $unwind: '$entryPubStatus'
    },

     // Final
    {
      $project: {
        _id: 0,
        entryId: 1,
        name: 1,
        //description: 1,
        userId: 1,

        creatorId: 1,
        msDuration: 1,
        categories: 1,
        categoriesIds: 1,

        createdAt: 1,
        updatedAt: 1,
        tags: 1,
        downloadUrl: 1
      }
    }

  ]);

  const json2csvParser = new Json2csvParser({field});
  const csv = json2csvParser.parse(docs);

  await writeFile('./csv/entrySheet.csv', csv);
  console.log('done!');
  process.exit(); 
}   

Каждая коллекция имеет 97k записей .Требуется целая дата для создания CSV.Интересно, есть ли способ улучшить его?

1 Ответ

0 голосов
/ 06 июня 2018

Я согласен с тем, что написано @NeilLunn.Но чтобы все же прояснить ваши вопросы, $lookup выполняет сопоставление равенства в ForeignField с localField из входных документов.Если документ в коллекции from не содержит foreignField, $lookup рассматривает значение как нулевое для целей сопоставления.
Итак, создайте индекс для своего внешнего поля, чтобы вы выполняли 97k обращений к индексу ине сканы таблицы 97к.Время должно быть ниже

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