Я не уверен, что справедливо подразумевать, что функциональное программирование могло бы предложить какие-либо преимущества перед императивным программированием с точки зрения производительности при работе с огромным количеством данных.
Я думаю, вам нужно добавить еще один инструмент в ваш инструментарий, и это может быть RxJS .
RxJS - это библиотека для составления асинхронных и событийных программ с использованием наблюдаемых последовательностей.
Если вы не знакомы с RxJS или реактивным программированием в целом, мои примеры определенно будут выглядеть странно, но я думаю, что было бы хорошим вложением средств для ознакомления с этими понятиями
В вашем случае наблюдаемой последовательностью является ваш экземпляр MongoDB, который со временем генерирует записи.
Я собираюсь подделать вашу БД:
var db = range(1, 5);
Функция range
- это функция RxJS, которая будет выдавать значение в указанном диапазоне.
db.subscribe(n => {
console.log(`record ${n}`);
});
//=> record 1
//=> record 2
//=> record 3
//=> record 4
//=> record 5
Теперь меня интересуют только первая и последняя запись.
Я могу создать наблюдаемую, которая будет излучать только первую запись, и создать другую, которая будет излучать только последнюю:
var db = range(1, 5);
var firstRecord = db.pipe(first());
var lastRecord = db.pipe(last());
merge(firstRecord, lastRecord).subscribe(n => {
console.log(`record ${n}`);
});
//=> record 1
//=> record 5
Однако мне также нужно обрабатывать все записи партиями: (в этом примере я собираюсь создать партии по 10 записей в каждой)
var db = range(1, 100);
var batches = db.pipe(bufferCount(10))
var firstRecord = db.pipe(first());
var lastRecord = db.pipe(last());
merge(firstRecord, batches, lastRecord).subscribe(n => {
console.log(`record ${n}`);
});
//=> record 1
//=> record 1,2,3,4,5,6,7,8,9,10
//=> record 11,12,13,14,15,16,17,18,19,20
//=> record 21,22,23,24,25,26,27,28,29,30
//=> record 31,32,33,34,35,36,37,38,39,40
//=> record 41,42,43,44,45,46,47,48,49,50
//=> record 51,52,53,54,55,56,57,58,59,60
//=> record 61,62,63,64,65,66,67,68,69,70
//=> record 71,72,73,74,75,76,77,78,79,80
//=> record 81,82,83,84,85,86,87,88,89,90
//=> record 91,92,93,94,95,96,97,98,99,100
//=> record 100
Как вы можете видеть на выходе, он испустил:
- Первая запись
- Десять партий по 10 записей в каждой
- Последняя запись
Я не буду пытаться решить ваше упражнение для вас, и я не слишком знаком с RxJS, чтобы слишком подробно рассказать об этом.
Я просто хотел показать вам другой способ и дать вам знать, что это можно совместить с функциональным программированием.
Надеюсь, это поможет