сложный запрос mongodb между двумя коллекциями - PullRequest
0 голосов
/ 29 июня 2018

Довольно новый для узла и монго. Я разработчик из реляционной базы данных.

Меня попросили написать отчет для расчета коэффициента конверсии от лидов, связанных с бронированием автомобилей в счетах-фактурах. Конверсия - это когда счет выставляется в течение 60 дней с момента создания заявки.

Итак, мне удалось с помощью mongodb, mongoose и nodejs импортировать все данные из плоских файлов в две коллекции, лиды и счета. У меня есть 1 млн. Лидов и около 30 млн. Счетов за 5-летний период, и тарифы будут составляться ежемесячно. Все данные имеют общую регистрацию автомобиля.

Итак, моя проблема в том, как объединить данные вместе с mongoose и nodejs?

До сих пор я пытался найти какое-либо отдельное преимущество, поэтому найдите все счета-фактуры в течение 60-дневного периода, чтобы привести это предложение в категорию конверсий. Это работает, но мой сценарий останавливается после примерно 20 успешных обновлений. На данный момент я думаю, что мой сценарий, который делает отдельные запросы для счетов-фактур по каждому запросу, является слишком тяжелым грузом для mongodb, и я вижу, что создание миллионов отдельных запросов - это слишком много для mongodb.

После нескольких часов просмотра я не уверен, что мне нужно искать!?

Любая помощь будет принята с благодарностью.

1 Ответ

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

Ваша попытка должна работать без проблем. Что мне помогает, тем не менее, с большими экземплярами данных Mongo DB и анализом на них: Выполнять запросы непосредственно в Mongo, а не через Node. Таким образом, вы избегаете необходимости преобразовывать структуры Mongo (например, итераторы) в структуры Node (например, массивы) и, как правило, теряете много служебных данных.

Кроме того, убедитесь, что вы правильно настроили индексы. Это может быть ОГРОМНОЕ различие с точки зрения производительности в больших базах данных.

Что бы я сделал тогда, это что-то вроде (это следует считать псевдокодом):

let converted = 0;
db.leads.find({},{id: 1, date: 1}).forEach(lead => {
    const hasInvoices = db.invoices.count({leadId: lead.id, date: {$lt: lead.date + 60}});
    converted ++;

});

Чтобы ускорить процесс, я бы использовал следующий индекс для этого случая:

db.invoices.createIndex({leadId: 1, date: -1});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...