#mongodb #mongoose #nestjs #bulk
#mongodb #mongoose #nestjs #массовая
Вопрос:
У меня есть коллекция с примерно 50 000 записей, которая содержит несколько полей.
Комбинация двух из них является uniq (идентификатор объекта и строка).
Мне требуется около 15 секунд, чтобы вставить 500 записей. Есть ли способ сделать это быстрее? Я пытался использовать bulkWrite (с ordered:false) вместо множественного updateOne() для сбора с помощью NestJS, но выигрыша нет.
myObjects.forEach(objects => {
const upsertDoc = {
updateOne: {
filter: { someOid: myOid, someString: myString },
update: { $set: myObject },
upsert: true,
},
};
bulkOps.push(upsertDoc);
}
myModel.collection.bulkWrite(bulkOps, { ordered: false });
Я попробовал с пустой коллекцией, и это намного быстрее (200 мс), я думаю, что это часть фильтра, которая занимает слишком много времени.
Комментарии:
1. При обновлении выясните, привязана ли база данных к процессору или к диску.
2. Проверьте один из вызовов updateOne с
explain
помощью .3. Возможно
.forEach()
, это медленная часть, а не массовое обновление.4. График показывает, что MongoDB не ограничен ни процессором, ни диском, для каждого из них это делается менее чем за секунду, MongoDB регистрирует, что массовое обновление занимает около 14500 секунд каждый раз
5. Можем ли мы увидеть эту запись в журнале?
Ответ №1:
Решение, которое я нашел, заключалось в поиске не по двум полям, а только по одному (просто _id в случае ma), что значительно повышает производительность