В приложении node.js я хотел использовать insertMany
для вставки большого количества документов (ну, на самом деле, около 10 000).Я столкнулся со следующей проблемой: во время работы insertMany
(вызывается с await
) процесс node.js не обрабатывает ничего из цикла обработки, пока не завершится вызов insertMany
.
Этоожидаемое поведение?Как бы я поступил так «правильно», чтобы мой сервис продолжал обрабатывать запросы?Я бы ожидал, что await insertMany
автоматически включит это, поскольку это асинхронно, но, похоже, это не так.
Фрагмент кода:
exports.writeOrg = async (req, res, next) => {
logger.debug('orgs.writeOrg()');
// ...
try {
// ...
logger.debug('Starting processing of data.');
const newOrgDocs = await processLdapUsers(tenantId, ldapUsers);
logger.debug('Processing of data finished.');
const orgModel = getOrgModel(tenantId);
// Now delete the entire collection
logger.debug(`Delete entire org collection in tenant ${tenantId}`);
await orgModel.deleteMany({});
// And add the new org information; this replaces what was there before
logger.debug(`Inserting org structure to tenant ${tenantId}`);
// This is the call which seems to block: --->
await orgModel.insertMany(newOrgDocs);
// <---
logger.debug(`Finished inserting org structure to tenant ${tenantId}`);
// ...
} catch (err) {
// ...
// error handling
}
}
Функция writeOrg
обработчик регулярных экспресс-запросов;полезная нагрузка представляет собой массив JSON с обычно 1000-20000 записями;в тестовом примере у меня 6000 записей с общим размером JSON около 6 МБ.Локальная запись занимает всего около 1,5 с, запись в MongoDB Atlas (самый дешевый уровень для тестирования) занимает около 20 секунд, и именно тогда возникает эта проблема.
Обходной путь : если я разделю данныев меньшие порции, например, 50 записей одновременно, цикл обработки событий время от времени обрабатывает некоторые данные для других запросов.Но все же, поскольку функция insertMany
является вызовом функции async
, я не ожидал, что это будет необходимо.