@360-l/mongo-bulk-data-migration
Version:
MongoDB bulk data migration for node scripts
69 lines (68 loc) • 2.75 kB
TypeScript
import type { Db, Filter, FindOptions, UpdateFilter, ObjectId, Document } from 'mongodb';
import type { DELETE_OPERATION } from './lib/MigrationBulk';
import { DELETE_COLLECTION } from './MongoBulkDataMigration';
export type DataMigrationOptions<TSchema> = {
arrayFilters: Document[];
bypassRollbackValidation: boolean;
bypassUpdateValidation: boolean;
dontCount: boolean;
continueOnBulkWriteError: boolean;
maxBulkSize: number;
maxConcurrentUpdateCalls: number;
projectionBackupFilter?: Array<keyof TSchema>;
rollbackable: boolean;
throttle: number;
};
export type RollbackDocument = {
_id: ObjectId;
date: Date;
backup: any;
updateQuery: string;
};
export type RollBackUpdateObject = {
$set?: any;
$unset?: any;
arrayFilters?: Document[];
};
export type MongoPipeline = object[];
export type MigrationInfos<TSchema extends Document> = {
db: Db;
operation?: typeof DELETE_COLLECTION;
projection: FindOptions<TSchema>['projection'];
rollback?: (backup?: RollbackDocument['backup']) => RollBackUpdateObject;
query: Filter<TSchema> | MongoPipeline;
update: UpdateFilter<TSchema> | typeof DELETE_OPERATION | ((arg: TSchema | UpdateFilter<TSchema>) => Promise<UpdateFilter<TSchema>> | UpdateFilter<TSchema>);
};
export type DataMigrationConfig<TSchema extends Document> = DMInstanceSpecialOperation<TSchema> | DMInstanceSpecialOperationDropDocument<TSchema> | DMInstanceAggregate<TSchema> | DMInstanceFilter<TSchema>;
type DMInstanceSpecialOperationDropDocument<TSchema> = Omit<DMInstanceFilter<TSchema>, 'projection'> & {
update: typeof DELETE_OPERATION;
};
type DMInstanceAggregate<TSchema> = DMInstanceBase<TSchema> & {
query: MongoPipeline;
};
export type DMInstanceSpecialOperation<TSchema> = Pick<DMInstanceBase<TSchema>, 'db' | 'id' | 'collectionName' | 'logger' | 'options'> & {
operation: typeof DELETE_COLLECTION;
};
export type DMInstanceFilter<TSchema extends Document> = DMInstanceBase<TSchema> & {
projection: FindOptions<TSchema>['projection'];
query: Filter<TSchema>;
};
type DMInstanceBase<TSchema> = {
collectionName: string;
db: Db;
id: string;
logger?: LoggerInterface;
options?: Partial<DataMigrationOptions<TSchema>>;
rollback?: (backup: RollbackDocument['backup']) => RollBackUpdateObject;
update: UpdateFilter<TSchema> | typeof DELETE_OPERATION | ((arg: TSchema) => Promise<UpdateFilter<TSchema>> | UpdateFilter<TSchema>);
};
export type LoggerInterface = {
info: (...params: any[]) => void;
warn: (...params: any[]) => void;
};
export interface RollbackableUpdate {
setLogger(logger: LoggerInterface): void;
rollback(): Promise<any>;
update(): Promise<any>;
}
export {};