mirror of
https://github.com/zkldi/Tachi.git
synced 2026-09-27 17:38:11 +03:00
33 lines
774 B
TypeScript
33 lines
774 B
TypeScript
/* eslint-disable no-await-in-loop */
|
|
import CreateLogCtx from "lib/logger/logger";
|
|
import { ICollection } from "monk";
|
|
|
|
const logger = CreateLogCtx(__filename);
|
|
|
|
export async function EfficientDBIterate<T, R>(
|
|
collection: ICollection<T>,
|
|
callbackFn: (c: T) => Promise<R>,
|
|
saveOp: (c: R[]) => Promise<void>,
|
|
filter: any = {},
|
|
bucketSize = 10_000
|
|
) {
|
|
let i = 0;
|
|
|
|
// eslint-disable-next-line no-constant-condition
|
|
while (true) {
|
|
logger.info(`Running on ${i} - ${i + bucketSize} documents.`);
|
|
// eslint-disable-next-line no-await-in-loop
|
|
const docs = await collection.find(filter, { limit: bucketSize, skip: i });
|
|
|
|
if (docs.length === 0) {
|
|
break;
|
|
}
|
|
|
|
const rDocs = await Promise.all(docs.map(callbackFn));
|
|
|
|
i += bucketSize;
|
|
|
|
await saveOp(rDocs);
|
|
}
|
|
}
|