@resolveio/server-lib 20.4.2 → 20.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/managers/mongo.manager.ts"],"names":["simpl_schema_1","require","mongodb_1","index_1","user_collection_1","common_1","log_collection_1","NodeCache","crypto","scmp","monitor_manager_1","os_1","numCPUs","cpus","length","v8","async_1","MongoManager","serverConfig","_this","this","_collections","_cacheId","_heapSize","getHeapStatistics","_serverCollections","_debugRemoveCacheHits","_debugMongoQueueCollections","_serverConfig","_isWorkersEnabled","_isWorkerInstance","_nodeCache","stdTTL","checkperiod","process","env","IS_WORKERS_ENABLED","IS_WORKER_INSTANCE","setCacheLimit","setInterval","ResolveIOServer","getMainServer","getSubscriptionManager","getEnableDebug","console","log","Date","JSON","stringify","initServerCollections","setupChangeStream","prototype","_heapLimit","getMainDB","listCollections","toArray","collections","_a","sent","getServerCollections","registerCollection","collection","collectionOptions","timeseries","timeField","some","a","name","collectionName","type","dropCollection","then","createCollection","push","find","filter","options","cacheKey","generateCacheKey","undefined","result","getFromCache","monitor","MonitorMongo","finish","addToCache","error","error_1","findOne","error_2","aggregate","pipeline","error_3","functionName","args","keyString","createHash","update","digest","cachedData","get","parse","dateReviver","del","data","getBinarySize","nodeCacheSize","getStats","vsize","deleteCount","_i","keys_1","keys","key","set","invalidateQueryCache","keys_2","includes","concat","changeStream","getMongoConnection","db","watch","on","change","__awaiter","coll","err","close","setTimeout","MongoManagerModel","exports","versionOptions","collection_main","collection_version","MongoManagerUserCollection","MongoManagerCollection","useVersionCollection","useVersions","versionSchema","deepCopy","schema","_id","blackbox","useReportBuilder","reportBuilderLookupTables","timestamps","createLogs","checkSchema","createIndex","_id._id","_id.__v","versionCollection","schemaCopy","interval","simplschema","rbSchema","useRB","default","buildRbLookups","buildRbSchema","getMongoManager","clearInterval","extractIndexNameFromError","errorMessage","matches","match","skipCache","Promise","resolve","reject","monitor_1","res","aggregateCount","aggregateCursor","cursor","ev","aggregateStream","streamOptions","stream","bulkWrite","operations","bypassLogs","bypassCheckSchema","logs","versionOps","deleteOldVersionsOps","bulkOps","updateFilters","updateManyFilters","deleteManyFilters","forEach","op","opType","Object","$or","__spreadArray","_b","_c","currentDocs","getNestedValue","doc","split","reduce","acc","part","Array","isArray","map","item","val","findMatchingDocs","matchDocument","every","value","docValue","subFilter","evaluateCondition","condition","$in","$nin","$ne","$gt","$gte","$lt","$lte","$exists","RegExp","$regex","$options","test","date","document","objectIdHexString","this_1","hasOwnProperty","__v","createdAt","updatedAt","validation","newContext","validate","validationErrors","getMethodManager","callMethodInternal","call","insertOne","id_document","payload","method","id_user","user","messageId","route","matchingDocs","_d","matchingDocs_1","currentDoc","$set","modifier","versionDoc","objectContainsPropertyDeep","$inc","deleteMany","upsert","$setOnInsert","replacement","_e","matchingDocs_2","_f","matchingDocs_3","operations_1","slice","mainResult","Logs","err_1","countDocuments","create","f_docs","insertMany","fieldOrSpec","indexQueue","action","specs","createIndexes","indexSpecs","docs","i","replaceOne","$and","acknowledged","deletedCount","deleteOne","monitor_2","findOneAndDelete","returnVal","monitor_3","distinct","drop","dropIndex","indexName","dropIndexes","monitor_4","findById","id","findCount","count","findCursor","removeAllListeners","findStream","monitor_5","findOneAndReplace","findOneAndUpdate","indexes","indexExists","bypassMonitor","validationResults","validDocs","idx","monitor_6","listIndexes","rename","newName","monitor_7","modifiedCount","prevDoc","docId","docVersion","updatedDoc_1","getMongoMergeUpdatedDoc","monitor_8","monitor_9","returnDocument","monitor_10","monitor_11","updateMany","bypassVersions","$unset","updateOne","monitor_12","monitor_13","monitor_14","ok","monitor_15","watchCollection","queue","task","callback","dbCollection","apply","code","err_2","message","existingIndexName","innerError_1","Error","_super","__extends","authenticate","password","attemptsInterval","Math","pow","attempts","calculatedInterval","last","now","getTime","Users","salt","pbkdf2","iterations","keylen","digestAlgorithm","hashBuffer","Buffer","from","hash","serializeUser","cb","username","deserializeUser","setPassword","randomBytes","saltBuffer","toString","pbkdf2Promisified","hashRaw","services","rej","changePassword","oldPassword","newPassword","authUser","register","email","resetAttempts","ObjectId","toHexString","saltlen","obj","prop"],"mappings":"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","file":"mongo.manager.js","sourcesContent":["import SimpleSchema from 'simpl-schema';\nimport { AggregateOptions, AggregationCursor, BulkWriteOptions, ChangeStream, ChangeStreamOptions, CommandOperationOptions, CountDocumentsOptions, CreateCollectionOptions, CreateIndexesOptions, CursorStreamOptions, DeleteOptions, Filter, FindCursor, FindOneAndDeleteOptions, FindOneAndReplaceOptions, FindOneAndUpdateOptions, FindOptions, IndexDescription, IndexInformationOptions, InsertOneOptions, ListIndexesCursor, ListIndexesOptions, ObjectId, RenameOptions, ReplaceOptions, UpdateOptions, OptionalId, Collection, CollectionInfo, OptionalUnlessRequiredId, AnyBulkWriteOperation, BulkWriteResult, DbStatsOptions } from 'mongodb';\nimport { LookupTables } from '../models/report-builder.model';\nimport { ResolveIOServer } from '../index';\nimport { Users } from '../collections/user.collection';\nimport { buildRbLookups, buildRbSchema, dateReviver, deepCopy, getBinarySize, getMongoMergeUpdatedDoc } from '../util/common';\nimport { UserModel } from '../models/user.model';\nimport { Logs } from '../collections/log.collection';\nimport * as NodeCache from 'node-cache';\nconst crypto = require('crypto');\nconst scmp = require('scmp');\nimport { MonitorMongo } from './monitor.manager';\nimport { CollectionDocument, Document } from '../models/collection-document.model';\nimport { cpus } from 'os';\nconst numCPUs = cpus().length;\nconst v8 = require('v8');\nimport async from 'async';\n\ninterface MongoQueueModel {\n\t_id: number,\n\tname_collection: string;\n\tlookup_collections: string[];\n\tname_function: string;\n\tdata_function: any[];\n\tname_function_addt: string;\n\tdata_function_addt: any[];\n\tcbs: Function[];\n\tcbs_next: Function[];\n\trunning: boolean;\n\tcacheId: number;\n\tinvalidateFlag: boolean;\n\tinvalidateCount: number;\n}\n\n// export declare interface MongoManagerFilterOperators<T> extends Document {\nexport declare interface MongoManagerFilterParamaterOperators<P> {\n\t$eq?: P;\n $gt?: P;\n $gte?: P;\n $in?: P extends Array<any> ? P : P[];\n $lt?: P;\n $lte?: P;\n $ne?: P;\n $nin?: P extends Array<any> ? P : P[];\n $not?: P extends string ? MongoManagerFilterParamaterOperators<P> | RegExpConstructor : MongoManagerFilterParamaterOperators<P>;\n $exists?: boolean;\n $expr?: any[]\n $regex?: P extends string ? RegExpConstructor | string : never;\n $options?: P extends string ? string : never;\n $geoIntersects?: {\n $geometry: Document;\n };\n $geoWithin?: Document;\n $near?: Document;\n $nearSphere?: Document;\n $maxDistance?: number;\n $all?: any[];\n $elemMatch?: Document;\n $size?: P extends any[] ? number : never;\n}\n\nexport declare interface MongoManagerFilterOperators<T> extends Document { //TODO: Remove extends document when I get answer on S.O.\n $and?: MongoManagerFilter<T>[] | MongoManagerFilterOperators<T>;\n $nor?: MongoManagerFilter<T>[] | MongoManagerFilterOperators<T>;\n $or?: MongoManagerFilter<T>[] | MongoManagerFilterOperators<T>;\n $text?: {\n $search: string;\n $language?: string;\n $caseSensitive?: boolean;\n $diacriticSensitive?: boolean;\n };\n $where?: string | ((this: T) => boolean);\n $comment?: string | Document;\n}\n\n// function isDotStringRegExp(obj: Object, dotKey: string): boolean {\n// \tlet keyData = dotKey.split('.');\n// \tlet objData = obj;\n\t\n// \tfor (let i = 0; i < keyData.length; i++) {\n// \t\tlet key = keyData[i];\n// \t\tif (objData.hasOwnProperty(key)) {\n// \t\t\tobjData = objData[key];\n\t\t\t\n// \t\t\tif (i === keyData.length - 1) {\n// \t\t\t\treturn true;\n// \t\t\t}\n// \t\t}\n// \t\telse {\n// \t\t\treturn false;\n// \t\t}\n// \t}\n// }\n\n// export declare type MongoManagerDotStringFilter<T> = {\n// \t[key: string]: (isDotStringRegExp(T, key) ? any : never);\n// };\n\nexport declare type MongoManagerFilter<T> = {\n\t[P in keyof T]?: T[P] | MongoManagerFilterParamaterOperators<T[P]>;\n};\n\nexport declare type MongoManagerUnsetFilter<T> = {\n\t[P in keyof T]?: number | boolean;\n};\n\nexport declare type MongoManagerIncFilter<T> = {\n\t[P in keyof T]?: number;\n};\n\nexport declare type MongoManagerUpdateFilter<T> = {\n $inc?: MongoManagerIncFilter<T> | Document;\n $set?: MongoManagerFilter<T> | Document;\n $setOnInsert?: MongoManagerFilter<T> | Document;\n $unset?: MongoManagerUnsetFilter<T> | Document;\n};\n\nexport class MongoManager {\n\tprivate _collections: MongoManagerCollection<CollectionDocument>[] = [];\n\tprivate _nodeCache;\n\tprivate _cacheId = 1;\n\n\tprivate _heapSize = v8.getHeapStatistics() / numCPUs;\n\tprivate _heapLimit: number;\n\n\tprivate _serverCollections: (CollectionInfo | Pick<CollectionInfo, 'name' | 'type'>)[] = [];\n\n\tprivate _debugRemoveCacheHits = 0;\n\tprivate _debugMongoQueueCollections = [];\n\tprivate _serverConfig = null;\n\tprivate _isWorkersEnabled = false;\n\tprivate _isWorkerInstance = false;\n\n\tconstructor(serverConfig) {\n\t\tthis._serverConfig = serverConfig;\n\t\tthis._nodeCache = new NodeCache({ stdTTL: 0, checkperiod: 0 });\n\n\t\tthis._isWorkersEnabled = process.env.IS_WORKERS_ENABLED === 'true';\n\t\tthis._isWorkerInstance = process.env.IS_WORKER_INSTANCE === 'true';\n\n\t\t// Adjust cache size based on environment variables\n\t\tthis.setCacheLimit();\n\n\t\tsetInterval(() => {\n\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Mongo Manager', 'Collections', this._collections.length);\n\t\t\t\tconsole.log(new Date(), 'Mongo Manager', 'Server Collections', this._serverCollections.length);\n\t\t\t\tconsole.log(new Date(), 'Mongo Manager', 'Cache Cleanup Hits', JSON.stringify(this._debugRemoveCacheHits, null, 2));\n\t\t\t}\n\n\t\t\tthis._debugRemoveCacheHits = 0;\n\t\t\tthis._debugMongoQueueCollections = [];\n\t\t}, 60000);\n\n\t\tthis.initServerCollections();\n\n\t\tif (this._isWorkersEnabled && this._isWorkerInstance) {\n\t\t\tthis.setupChangeStream();\n\t\t}\n\t}\n\n\tprivate setCacheLimit() {\n\t\tif (this._isWorkersEnabled) {\n\t\t\tif (this._isWorkerInstance) {\n\t\t\t\tthis._heapLimit = this._heapSize * 0.8;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis._heapLimit = this._heapSize * 0.4;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tthis._heapLimit = this._heapSize * 0.3;\n\t\t}\n\t}\n\n\tasync initServerCollections() {\n\t\tlet collections = await ResolveIOServer.getMainDB().listCollections().toArray();\n\t\tthis._serverCollections = collections;\n\t}\n\n\tgetServerCollections() {\n\t\treturn this._serverCollections;\n\t}\n\n\tregisterCollection(collection: MongoManagerCollection<CollectionDocument>) {\n\t\tif (\n\t\t\tcollection.collectionOptions &&\n\t\t\tcollection.collectionOptions.timeseries &&\n\t\t\tcollection.collectionOptions.timeseries.timeField &&\n\t\t\tthis._serverCollections.some(a => a.name === collection.collectionName && a.type === 'collection')\n\t\t) {\n\t\t\tResolveIOServer.getMainDB()\n\t\t\t\t.dropCollection(collection.collectionName)\n\t\t\t\t.then(() => {\n\t\t\t\t\tthis.createCollection(collection);\n\t\t\t\t});\n\t\t}\n\n\t\tthis._collections.push(collection);\n\t}\n\n\tcreateCollection(collection: MongoManagerCollection<CollectionDocument>) {\n\t\tResolveIOServer.getMainDB().createCollection<CollectionDocument>(collection.collectionName, collection.collectionOptions);\n\t}\n\n\tcollections() {\n\t\treturn this._collections;\n\t}\n\n\tcollection(collectionName: string): MongoManagerCollection<CollectionDocument> | MongoManagerUserCollection<CollectionDocument> {\n\t\treturn this._collections.find(a => a.collectionName === collectionName);\n\t}\n\n\tpublic async find<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {},\n\t\toptions?: FindOptions<T>\n\t): Promise<T[]> {\n\t\ttry {\n\t\t\tconst cacheKey = this.generateCacheKey(collectionName, 'find', [filter, options]);\n\t\t\tlet result = this.getFromCache(cacheKey);\n\t\t\tif (result !== undefined) {\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\tconst monitor = new MonitorMongo('find', collectionName, JSON.stringify([filter, options]));\n\t\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\t\t\tresult = await collection.find(<any>filter, options).toArray();\n\t\t\tmonitor.finish();\n\n\t\t\tthis.addToCache(cacheKey, result);\n\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tconsole.error(new Date(), 'Error in find', collectionName, error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tpublic async findOne<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> | MongoManagerFilterOperators<T> = {},\n\t\toptions?: FindOptions<T>\n\t): Promise<T> {\n\t\ttry {\n\t\t\tconst cacheKey = this.generateCacheKey(collectionName, 'findOne', [filter, options]);\n\t\t\tlet result = this.getFromCache(cacheKey);\n\t\t\tif (result !== undefined) {\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\tconst monitor = new MonitorMongo('find', collectionName, JSON.stringify([filter, options]));\n\t\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\t\t\tresult = await collection.findOne(<any>filter, options);\n\t\t\tmonitor.finish();\n\n\t\t\tthis.addToCache(cacheKey, result);\n\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tconsole.error(new Date(), 'Error in find', collectionName, error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tpublic async aggregate<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tpipeline: any[],\n\t\toptions?: AggregateOptions\n\t): Promise<any[]> {\n\t\ttry {\n\t\t\tconst cacheKey = this.generateCacheKey(collectionName, 'aggregate', [pipeline, options]);\n\t\t\tlet result = this.getFromCache(cacheKey);\n\t\t\tif (result !== undefined) {\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\tconst monitor = new MonitorMongo('aggregate', collectionName, JSON.stringify([pipeline, options]));\n\t\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\t\t\tresult = await collection.aggregate(pipeline, options).toArray();\n\t\t\tmonitor.finish();\n\n\t\t\tthis.addToCache(cacheKey, result);\n\n\t\t\treturn result;\n\t\t}\n\t\tcatch (error) {\n\t\t\tconsole.error(new Date(), 'Error in aggregate', collectionName, error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t// Implement other methods like findOne, insertOne, updateOne, etc., similarly\n\n\tprivate generateCacheKey(collectionName: string, functionName: string, args: any[]): string {\n\t\tconst keyString = JSON.stringify({ collectionName, functionName, args });\n\t\treturn crypto.createHash('sha256').update(keyString).digest('hex');\n\t}\n\n\tprivate getFromCache(cacheKey: string): any | undefined {\n\t\ttry {\n\t\t\tconst cachedData = this._nodeCache.get(cacheKey);\n\t\t\tif (cachedData) {\n\t\t\t\treturn JSON.parse(cachedData, dateReviver);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\t// If cache is corrupted or JSON parse fails, remove it\n\t\t\tthis._nodeCache.del(cacheKey);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate addToCache(cacheKey: string, data: any) {\n\t\tif (getBinarySize(JSON.stringify(data)) < 1000000) {\n\t\t\tlet nodeCacheSize = this._nodeCache.getStats().vsize;\n\n\t\t\tif (nodeCacheSize > this._heapLimit) {\n\t\t\t\tlet deleteCount = 0;\n\t\t\t\tconst keys = this._nodeCache.keys();\n\n\t\t\t\tfor (const key of keys) {\n\t\t\t\t\tthis._nodeCache.del(key);\n\t\t\t\t\tthis._debugRemoveCacheHits += 1;\n\t\t\t\t\tdeleteCount += 1;\n\n\t\t\t\t\tnodeCacheSize = this._nodeCache.getStats().vsize;\n\n\t\t\t\t\tif (nodeCacheSize < this._heapLimit * 0.75) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconsole.log('Query Cache: ' + 'Too Big, - Deleted: ' + deleteCount + ' - ' + nodeCacheSize);\n\t\t\t}\n\n\t\t\tthis._nodeCache.set(cacheKey, JSON.stringify(data));\n\t\t}\n\t}\n\n\tpublic invalidateQueryCache(collection: string) {\n\t\tconst keys = this._nodeCache.keys();\n\t\tfor (const key of keys) {\n\t\t\tif (key.includes(`\"collectionName\":\"${collection}\"`)) {\n\t\t\t\tthis._nodeCache.del(key);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate setupChangeStream() {\n\t\tconst db = ResolveIOServer.getMongoConnection().db(this._serverConfig['DATABASE']);\n\t\tconst changeStream = db.watch();\n\n\t\tchangeStream.on('change', async change => {\n\t\t\t// Call the invalidateQueryCache based on the collection affected\n\t\t\tif (change['ns'] && change['ns'].coll) {\n\t\t\t\tconst collectionName = change['ns'].coll;\n\n\t\t\t\tif (this.collection(collectionName)) {\n\t\t\t\t\tthis.invalidateQueryCache(collectionName);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tchangeStream.on('error', err => {\n\t\t\tconsole.log(new Date(), 'Mongo change stream error. Restart...');\n\t\t\tchangeStream.close();\n\t\t\tsetTimeout(() => this.setupChangeStream(), 5000); // Restart after a delay\n\t\t});\n\n\t\tchangeStream.on('close', () => {\n\t\t\tconsole.log(new Date(), 'Mongo change stream closed. Restarting...');\n\t\t\tsetTimeout(() => this.setupChangeStream(), 5000); // Restart after a delay\n\t\t});\n\t}\n}\n\nexport class MongoManagerModel<T extends CollectionDocument> {\n\tcollection_main: MongoManagerCollection<T> | MongoManagerUserCollection<T> = null;\n\tcollection_version: MongoManagerCollection<T> | MongoManagerUserCollection<T> = null;\n\n\tconstructor(options: MongoManagerCollectionOptions) {\n\t\tif (options.collectionName === 'users') {\n\t\t\tthis.collection_main = new MongoManagerUserCollection<T>(options);\n\t\t}\n\t\telse {\n\t\t\tthis.collection_main = new MongoManagerCollection<T>(options);\n\t\t}\n\n\t\tif (options.useVersionCollection) {\n\t\t\tthis.collection_main.useVersions = true;\n\t\t\t\n\t\t\tlet versionSchema = deepCopy(options.schema);\n\t\t\tversionSchema._id.type = 'Object';\n\t\t\tversionSchema._id.blackbox = true;\n\n\t\t\tlet versionOptions: MongoManagerCollectionOptions = {\n\t\t\t\tcollectionName: options.collectionName + '.versions',\n\t\t\t\tschema: versionSchema,\n\t\t\t\tuseVersionCollection: false,\n\t\t\t\tuseReportBuilder: false,\n\t\t\t\treportBuilderLookupTables: [],\n\t\t\t\ttimestamps: true,\n\t\t\t\tcreateLogs: false,\n\t\t\t\tcheckSchema: false,\n\t\t\t\tcollectionOptions: null\n\t\t\t};\n\n\t\t\tif (options.collectionName === 'users') {\t\n\t\t\t\tthis.collection_version = new MongoManagerUserCollection<T>(versionOptions);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.collection_version = new MongoManagerCollection<T>(versionOptions);\n\t\t\t}\n\n\t\t\tthis.collection_version.createIndex({'_id._id': 1, '_id.__v': 1});\n\t\t\tthis.collection_main.versionCollection = options.collectionName + '.versions';\n\t\t}\n\t}\n}\n\nexport interface MongoManagerCollectionOptions {\n\tcollectionName: string;\n\tschema: object;\n\tuseVersionCollection: boolean;\n\tuseReportBuilder: boolean;\n\treportBuilderLookupTables: LookupTables[]\n\ttimestamps: boolean;\n\tcreateLogs: boolean;\n\tcheckSchema: boolean;\n\tcollectionOptions: CreateCollectionOptions;\n}\n\nexport class MongoManagerCollection<T extends CollectionDocument> {\n\tcollectionName = '';\n\tcheckSchema = false;\n\tsimplschema = null;\n\trbSchema = null;\n\ttimestamps = false;\n\tuseVersions = false;\n\tversionCollection = '';\n\tcreateLogs = true;\n\tuseRB = false;\n\tcollectionOptions: CreateCollectionOptions;\n\t\n\tconstructor(options: MongoManagerCollectionOptions) {\n\t\tthis.collectionName = options.collectionName;\n\t\tthis.simplschema = new SimpleSchema(options.schema);\n\t\tthis.timestamps = options.timestamps;\n\t\tthis.createLogs = options.createLogs;\n\t\tthis.checkSchema = options.checkSchema;\n\t\tthis.collectionOptions = options.collectionOptions;\n\n\t\tif (options.useReportBuilder) {\n\t\t\tthis.useRB = true;\n\t\t\tlet schemaCopy = deepCopy(options.schema);\n\t\t\tlet rbSchema = buildRbLookups(options.reportBuilderLookupTables, schemaCopy, []);\n\t\t\tthis.rbSchema = buildRbSchema(rbSchema);\n\t\t}\n\n\t\tlet interval = setInterval(() => {\n\t\t\tif (ResolveIOServer && ResolveIOServer.getMainServer() && ResolveIOServer.getMongoManager() && ResolveIOServer.getMongoManager().getServerCollections().length) {\n\t\t\t\tResolveIOServer.getMongoManager().registerCollection(this);\n\t\t\t\tclearInterval(interval);\n\t\t\t}\n\t\t}, 1);\n\t}\n\n\tprivate static indexQueue = async.queue(async (task, callback) => {\n const { action, collection, specs, options } = task;\n \n const dbCollection = ResolveIOServer.getMainDB().collection(collection.collectionName, collection.collectionOptions);\n \n if (!dbCollection) {\n return callback(new Error(`Collection ${collection.collectionName} not found`));\n }\n\n let monitor = new MonitorMongo(action, collection.collectionName, JSON.stringify([specs, options]));\n\n const createIndex = async () => {\n try {\n const result = await dbCollection[action](...specs, options);\n monitor.finish();\n callback(null, result);\n } catch (err) {\n if (err.code === 85 || err.message.includes('IndexOptionsConflict')) {\n try {\n const existingIndexName = collection.extractIndexNameFromError(err.message);\n if (existingIndexName) {\n await dbCollection.dropIndex(existingIndexName);\n return await createIndex();\n }\n } catch (innerError) {\n callback(innerError);\n }\n }\n monitor.finish();\n callback(err);\n }\n };\n\n await createIndex();\n }, 1);\n\n // Method to extract index name from error message\n extractIndexNameFromError(errorMessage) {\n\t\tlet regexPattern = /Index already exists with a different name: (\\S+)/;\n\t\tlet matches = errorMessage.match(regexPattern);\n\t\n\t\tif (!matches || matches.length <= 1) {\n\t\t\t// If the first pattern doesn't match, try the second pattern\n\t\t\tregexPattern = /existing index:.*name: \"([^\"]+)\"/;\n\t\t\tmatches = errorMessage.match(regexPattern);\n\t\t}\n\t\n\t\treturn matches && matches.length > 1 ? matches[1] : null;\n\t}\t\n\n\taggregate(pipeline: object[], options?: AggregateOptions, skipCache = false) : Promise<any[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tif (!skipCache) {\n\t\t\t\tResolveIOServer.getMongoManager().aggregate(this.collectionName, pipeline, options).then(res => {\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet monitor = new MonitorMongo('aggregate', this.collectionName, JSON.stringify([pipeline, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options).toArray().then(res => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Aggregate', this.collectionName, pipeline, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tasync aggregateCount(pipeline: object[], options?: AggregateOptions) : Promise<number> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('aggregateCount', this.collectionName, JSON.stringify([pipeline, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options).toArray().then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res.length);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Aggregate', this.collectionName, pipeline, options, err);\n\t\t\t\treject(0);\n\t\t\t});\n\t\t});\n\t}\n\n\taggregateCursor(pipeline: object[], options?: AggregateOptions): AggregationCursor {\n\t\tlet monitor = new MonitorMongo('aggregateCursor', this.collectionName, JSON.stringify([pipeline, options]));\n\t\tlet cursor = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options);\n\t\tcursor.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn cursor;\n\t}\n\n\taggregateStream(pipeline: object[], options?: AggregateOptions, streamOptions?: CursorStreamOptions) {\n\t\tlet monitor = new MonitorMongo('aggregateStream', this.collectionName, JSON.stringify([pipeline, options, streamOptions]));\n\t\tlet stream = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options).stream(streamOptions);\n\t\tstream.on('end', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('error', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn stream;\n\t}\n\n\t// bulkWrite(operations: AnyBulkWriteOperation<T>[], options: BulkWriteOptions): Promise<BulkWriteResult> {\n\tbulkWrite(operations: any[], options?: BulkWriteOptions, bypassLogs = false, bypassCheckSchema = false): Promise<BulkWriteResult> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!operations.length) {\n\t\t\t\tresolve(null);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst logs = [];\n\t\t\tconst versionOps = []; // For storing versioning ops\n\t\t\tconst deleteOldVersionsOps = []; // For deleteMany operations to remove older versions\n\t\t\tconst bulkOps = [];\n\t\t\tconst updateFilters = [];\n\t\t\tconst updateManyFilters = [];\n\t\t\tconst deleteManyFilters = [];\n\t\n\t\t\t// Collect filters for all operations\n\t\t\toperations.forEach(op => {\n\t\t\t\tconst opType = Object.keys(op)[0];\n\t\t\t\tif (opType === 'updateOne' || opType === 'deleteOne' || opType === 'replaceOne') {\n\t\t\t\t\tupdateFilters.push(op[opType].filter); // Store filters for updateOne, deleteOne, and replaceOne\n\t\t\t\t}\n\t\t\t\telse if (opType === 'updateMany') {\n\t\t\t\t\tupdateManyFilters.push(op[opType].filter); // Store the entire filter for updateMany\n\t\t\t\t}\n\t\t\t\telse if (opType === 'deleteMany') {\n\t\t\t\t\tdeleteManyFilters.push(op[opType].filter); // Store the entire filter for deleteMany\n\t\t\t\t}\n\t\t\t});\n\t\n\t\t\t// Pre-fetch all documents based on the filters before proceeding with the bulk operations\n\t\t\tconst currentDocs = updateFilters.length || updateManyFilters.length || deleteManyFilters.length\n\t\t\t\t? await this.find(<any>{ $or: [...updateFilters, ...updateManyFilters, ...deleteManyFilters] })\n\t\t\t\t: [];\n\n\t\t\t// Helper function to get the value from a document using a dot-notated key (e.g., 'obj.property')\n\t\t\t// This will also handle arrays of objects (e.g., 'obj.arrayOfObjects.property')\n\t\t\tconst getNestedValue = (doc, key) => {\n\t\t\t\tconst parts = key.split('.');\n\n\t\t\t\treturn parts.reduce((acc, part) => {\n\t\t\t\t\tif (Array.isArray(acc)) {\n\t\t\t\t\t\t// If we're dealing with an array, return an array of values for each element\n\t\t\t\t\t\treturn acc.map(item => item[part]).filter(val => val !== undefined);\n\t\t\t\t\t}\n\t\t\t\t\treturn acc && acc[part];\n\t\t\t\t}, doc);\n\t\t\t};\n\t\n\t\t\t// Helper function to locally find matching documents based on filter\n\t\t\tconst findMatchingDocs = (filter) => {\n\t\t\t\treturn currentDocs.filter(doc => {\n\t\t\t\t\treturn matchDocument(filter, doc);\n\t\t\t\t});\n\t\t\t};\n\n\t\t\tconst matchDocument = (filter, doc) => {\n\t\t\t\treturn Object.keys(filter).every(key => {\n\t\t\t\t\tconst value = filter[key];\n\t\t\t\t\tconst docValue = getNestedValue(doc, key); // Get nested value from the document\n\t\t\t\n\t\t\t\t\t// Handle logical operators\n\t\t\t\t\tif (key === '$and') {\n\t\t\t\t\t\treturn value.every(subFilter => matchDocument(subFilter, doc));\n\t\t\t\t\t}\n\t\t\t\n\t\t\t\t\tif (key === '$or') {\n\t\t\t\t\t\treturn value.some(subFilter => matchDocument(subFilter, doc));\n\t\t\t\t\t}\n\t\t\t\n\t\t\t\t\t// If docValue is an array, apply filter conditions to each element\n\t\t\t\t\tif (Array.isArray(docValue)) {\n\t\t\t\t\t\treturn docValue.some(val => evaluateCondition(value, val));\n\t\t\t\t\t}\n\t\t\t\n\t\t\t\t\t// Otherwise, apply the condition to the single value\n\t\t\t\t\treturn evaluateCondition(value, docValue);\n\t\t\t\t});\n\t\t\t};\n\t\t\t\n\t\t\t// Helper function to evaluate the condition (value) against the document value (docValue)\n\t\t\tconst evaluateCondition = (condition, docValue) => {\n\t\t\t\t// If condition is an object, handle operators like $in, $nin, $ne, etc.\n\t\t\t\tif (condition instanceof Object) {\n\t\t\t\t\tif ('$in' in condition) {\n\t\t\t\t\t\treturn condition.$in.includes(docValue);\n\t\t\t\t\t}\n\t\t\t\t\tif ('$nin' in condition) {\n\t\t\t\t\t\treturn !condition.$nin.includes(docValue);\n\t\t\t\t\t}\n\t\t\t\t\tif ('$ne' in condition) {\n\t\t\t\t\t\treturn docValue !== condition.$ne;\n\t\t\t\t\t}\n\t\t\t\t\tif ('$gt' in condition) {\n\t\t\t\t\t\treturn docValue > condition.$gt;\n\t\t\t\t\t}\n\t\t\t\t\tif ('$gte' in condition) {\n\t\t\t\t\t\treturn docValue >= condition.$gte;\n\t\t\t\t\t}\n\t\t\t\t\tif ('$lt' in condition) {\n\t\t\t\t\t\treturn docValue < condition.$lt;\n\t\t\t\t\t}\n\t\t\t\t\tif ('$lte' in condition) {\n\t\t\t\t\t\treturn docValue <= condition.$lte;\n\t\t\t\t\t}\n\t\t\t\t\tif ('$exists' in condition) {\n\t\t\t\t\t\treturn (docValue !== undefined) === condition.$exists;\n\t\t\t\t\t}\n\t\t\t\t\tif ('$regex' in condition) {\n\t\t\t\t\t\tconst regex = new RegExp(condition.$regex, condition.$options || '');\n\t\t\t\t\t\treturn regex.test(docValue);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\n\t\t\t\t// Handle regular equality comparison\n\t\t\t\treturn docValue === condition;\n\t\t\t};\n\t\n\t\t\tfor (const op of operations) {\n\t\t\t\tconst opType = Object.keys(op)[0];\n\t\t\t\tlet doc = op[opType];\n\t\n\t\t\t\tif (opType === 'insertOne') {\n\t\t\t\t\t// Ensure _id and __v for insertOne operations\n\t\t\t\t\tif (!doc.document._id) {\n\t\t\t\t\t\tdoc.document._id = objectIdHexString();\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (this.useVersions && !doc.document.hasOwnProperty('__v')) {\n\t\t\t\t\t\tdoc.document.__v = 0;\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tlet date = new Date();\n\n\t\t\t\t\t\tif (!doc.document.createdAt) {\n\t\t\t\t\t\t\tdoc.document.createdAt = date;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!doc.document.updatedAt) {\n\t\t\t\t\t\t\tdoc.document.updatedAt = date;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\t\tconst isValid = validation.validate(doc.document);\n\t\t\n\t\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - bulkWrite - insertOne', validation.validationErrors());\n\t\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on bulkWrite insertOne - ' + this.collectionName, [validation.validationErrors(), doc.document]);\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t// Log the operation\n\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\tid_document: doc.document._id,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options])) < 200000 ? JSON.stringify([op, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\n\t\t\t\t\tbulkOps.push(op); // Add insertOne operation to bulkOps\n\t\t\t\t} \n\t\t\t\telse if (opType === 'updateOne') {\t\n\t\t\t\t\t// Find all matching documents locally based on filter\n\t\t\t\t\tconst matchingDocs = findMatchingDocs(doc.filter);\n\t\n\t\t\t\t\tif (matchingDocs.length) {\n\t\t\t\t\t\tfor (let currentDoc of matchingDocs) {\n\t\t\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\t\t\tif (doc.update.$set) {\n\t\t\t\t\t\t\t\t\tdoc.update.$set.updatedAt = new Date();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\tdoc.update.$set = { updatedAt: new Date() };\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\t\t\t\tconst isValid = validation.validate(doc.update, {modifier: true});\n\t\t\t\t\n\t\t\t\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - bulkWrite - updateOne', validation.validationErrors());\n\t\t\t\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on bulkWrite updateOne - ' + this.collectionName, [validation.validationErrors(), doc.update, currentDoc]);\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\t\tlet versionDoc = deepCopy(currentDoc);\n\n\t\t\t\t\t\t\t\tversionDoc._id = <any>{_id: versionDoc._id, __v: versionDoc.__v};\n\n\t\t\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\t\tdocument: versionDoc\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\n\t\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.update, '__v')) {\n\t\t\t\t\t\t\t\t\tif (!doc.update.$inc) {\n\t\t\t\t\t\t\t\t\t\tdoc.update.$inc = { __v: 1 };\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\tdoc.update.$inc.__v = 1;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\t\t// Delete old versions if __v >= 4\n\t\t\t\t\t\t\t\tif (versionDoc.__v >= 4) {\n\t\t\t\t\t\t\t\t\tdeleteOldVersionsOps.push({\n\t\t\t\t\t\t\t\t\t\tdeleteMany: {\n\t\t\t\t\t\t\t\t\t\t\tfilter: {\n\t\t\t\t\t\t\t\t\t\t\t\t'_id._id': versionDoc._id._id,\n\t\t\t\t\t\t\t\t\t\t\t\t'_id.__v': { $lt: versionDoc.__v - 4 }\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\t\tid_document: currentDoc._id,\n\t\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options, currentDoc])) < 200000 ? JSON.stringify([op, options, currentDoc], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\tbulkOps.push(op); // Add updateOne or replaceOne operation to bulkOps\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (doc.upsert) {\n\t\t\t\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\t\t\t\tconst isValid = validation.validate(doc.update, {modifier: true});\n\t\t\t\t\n\t\t\t\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - bulkWrite - updateOne', validation.validationErrors());\n\t\t\t\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on bulkWrite updateOne - ' + this.collectionName, [validation.validationErrors(), doc.update]);\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.update, '_id')) {\n\t\t\t\t\t\t\t\tdoc.update.$setOnInsert._id = objectIdHexString();\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.update, '__v')) {\n\t\t\t\t\t\t\t\t\tdoc.update.$setOnInsert.__v = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n \n\t\t\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.update, 'createdAt')) {\n\t\t\t\t\t\t\t\t\tdoc.update.$setOnInsert.createdAt = new Date();\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.update, 'updatedAt')) {\n\t\t\t\t\t\t\t\t\tdoc.update.$setOnInsert.updatedAt = new Date();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\t\tid_document: doc.update.$setOnInsert._id,\n\t\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options, doc.update])) < 200000 ? JSON.stringify([op, options, doc.update], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\tbulkOps.push(op); // Add updateOne or replaceOne operation to bulkOps\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (opType === 'replaceOne') {\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tdoc.replacement.updatedAt = new Date();\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Find all matching documents locally based on filter\n\t\t\t\t\tconst matchingDocs = findMatchingDocs(doc.filter);\n\t\n\t\t\t\t\tif (matchingDocs.length) {\n\t\t\t\t\t\tfor (let currentDoc of matchingDocs) {\n\t\t\t\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\t\t\t\tconst isValid = validation.validate(doc.replacement);\n\t\t\t\t\n\t\t\t\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - bulkWrite - insertOne', validation.validationErrors());\n\t\t\t\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on bulkWrite replaceOne - ' + this.collectionName, [validation.validationErrors(), doc.replacement]);\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\t\tlet versionDoc = deepCopy(currentDoc);\n\n\t\t\t\t\t\t\t\tversionDoc._id = <any>{_id: versionDoc._id, __v: versionDoc.__v};\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\t\tdocument: versionDoc\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\n\t\t\t\t\t\t\t\tdoc.replacement.__v = versionDoc.__v + 1;\n\t\t\n\t\t\t\t\t\t\t\t// Delete old versions if __v >= 4\n\t\t\t\t\t\t\t\tif (versionDoc.__v >= 4) {\n\t\t\t\t\t\t\t\t\tdeleteOldVersionsOps.push({\n\t\t\t\t\t\t\t\t\t\tdeleteMany: {\n\t\t\t\t\t\t\t\t\t\t\tfilter: {\n\t\t\t\t\t\t\t\t\t\t\t\t'_id._id': versionDoc._id._id,\n\t\t\t\t\t\t\t\t\t\t\t\t'_id.__v': { $lt: versionDoc.__v - 4 }\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\t\tid_document: currentDoc._id,\n\t\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options, currentDoc])) < 200000 ? JSON.stringify([op, options, currentDoc], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\tbulkOps.push(op); // Add updateOne or replaceOne operation to bulkOps\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (doc.upsert) {\n\t\t\t\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\t\t\t\tconst isValid = validation.validate(doc.replacement);\n\t\t\t\t\n\t\t\t\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - bulkWrite - replaceOne', validation.validationErrors());\n\t\t\t\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on bulkWrite replaceOne - ' + this.collectionName, [validation.validationErrors(), doc.replacement]);\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.replacement, '_id')) {\n\t\t\t\t\t\t\t\tdoc.replacement._id = objectIdHexString();\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.replacement, '__v')) {\n\t\t\t\t\t\t\t\t\tdoc.replacement.__v = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n \n\t\t\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.replacement, 'createdAt')) {\n\t\t\t\t\t\t\t\t\tdoc.replacement.createdAt = new Date();\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.replacement, 'updatedAt')) {\n\t\t\t\t\t\t\t\t\tdoc.replacement.updatedAt = new Date();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\t\tid_document: doc.replacement._id,\n\t\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options, doc.replacement])) < 200000 ? JSON.stringify([op, options, doc.replacement], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\tbulkOps.push(op); // Add updateOne or replaceOne operation to bulkOps\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (opType === 'deleteOne') {\n\t\t\t\t\t// Find all matching documents locally based on filter\n\t\t\t\t\tconst matchingDocs = findMatchingDocs(doc.filter);\n\t\t\t\t\t\n\t\t\t\t\tmatchingDocs.forEach(currentDoc => {\n\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\tlet versionDoc = deepCopy(currentDoc);\n\n\t\t\t\t\t\t\tversionDoc._id = <any>{_id: versionDoc._id, __v: versionDoc.__v};\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: versionDoc\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\n\t\t\t\t\t\t\t// Delete old versions if __v >= 4\n\t\t\t\t\t\t\tif (versionDoc.__v >= 4) {\n\t\t\t\t\t\t\t\tdeleteOldVersionsOps.push({\n\t\t\t\t\t\t\t\t\tdeleteMany: {\n\t\t\t\t\t\t\t\t\t\tfilter: {\n\t\t\t\t\t\t\t\t\t\t\t'_id._id': versionDoc._id._id,\n\t\t\t\t\t\t\t\t\t\t\t'_id.__v': { $lt: versionDoc.__v - 4 }\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\tid_document: currentDoc._id,\n\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options, currentDoc])) < 200000 ? JSON.stringify([op, options, currentDoc], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tbulkOps.push(op); // Add deleteOne operation to bulkOps\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (opType === 'updateMany') {\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tif (doc.update.$set) {\n\t\t\t\t\t\t\tdoc.update.$set.updatedAt = new Date();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdoc.update.$set = {\n\t\t\t\t\t\t\t\tupdatedAt: new Date()\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.update, '__v')) {\n\t\t\t\t\t\t\tif (!doc.update.$inc) {\n\t\t\t\t\t\t\t\tdoc.update.$inc = { __v: 1 };\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tdoc.update.$inc.__v = 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Process all documents matching the updateMany filter locally\n\t\t\t\t\tconst matchingDocs = findMatchingDocs(doc.filter);\n\t\n\t\t\t\t\tfor (let currentDoc of matchingDocs) {\n\t\t\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\t\t\tconst isValid = validation.validate(doc.update, {modifier: true});\n\t\t\t\n\t\t\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - bulkWrite - insertOne', validation.validationErrors());\n\t\t\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on bulkWrite updateMany - ' + this.collectionName, [validation.validationErrors(), doc.update]);\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\tlet versionDoc = deepCopy(currentDoc);\n\n\t\t\t\t\t\t\tversionDoc._id = <any>{_id: versionDoc._id, __v: versionDoc.__v};\n\n\t\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: versionDoc\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\n\t\t\t\t\t\t\t// Delete old versions if __v >= 4\n\t\t\t\t\t\t\tif (versionDoc.__v >= 4) {\n\t\t\t\t\t\t\t\tdeleteOldVersionsOps.push({\n\t\t\t\t\t\t\t\t\tdeleteMany: {\n\t\t\t\t\t\t\t\t\t\tfilter: {\n\t\t\t\t\t\t\t\t\t\t\t'_id._id': versionDoc._id._id,\n\t\t\t\t\t\t\t\t\t\t\t'_id.__v': { $lt: versionDoc.__v - 4 }\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\tid_document: currentDoc._id,\n\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options])) < 200000 ? JSON.stringify([op, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tbulkOps.push(op); // Add updateMany operation to bulkOps\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (opType === 'deleteMany') {\n\t\t\t\t\t// Process all documents matching the deleteMany filter locally\n\t\t\t\t\tconst matchingDocs = findMatchingDocs(doc.filter);\n\t\n\t\t\t\t\tmatchingDocs.forEach(currentDoc => {\n\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\tlet versionDoc = deepCopy(currentDoc);\n\n\t\t\t\t\t\t\tversionDoc._id = <any>{_id: versionDoc._id, __v: versionDoc.__v};\n\n\t\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: versionDoc\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\n\t\t\t\t\t\t\t// Delete old versions if __v >= 4\n\t\t\t\t\t\t\tif (versionDoc.__v >= 4) {\n\t\t\t\t\t\t\t\tdeleteOldVersionsOps.push({\n\t\t\t\t\t\t\t\t\tdeleteMany: {\n\t\t\t\t\t\t\t\t\t\tfilter: {\n\t\t\t\t\t\t\t\t\t\t\t'_id._id': versionDoc._id._id,\n\t\t\t\t\t\t\t\t\t\t\t'_id.__v': { $lt: versionDoc.__v - 4 }\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\tid_document: currentDoc._id,\n\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options])) < 200000 ? JSON.stringify([op, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tbulkOps.push(op); // Add deleteMany operation to bulkOps\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\ttry {\n\t\t\t\tif (bulkOps.length) {\n\t\t\t\t\tlet monitor = new MonitorMongo('bulkWrite', this.collectionName, JSON.stringify([bulkOps.slice(-100), options]));\n\t\t\t\t\t\n\t\t\t\t\t// First, perform the main bulk operations on the collection\n\t\t\t\t\tconst mainResult = await ResolveIOServer.getMainDB().collection<T>(this.collectionName).bulkWrite(bulkOps, options);\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\n\t\t\t\t\t// Separate bulkWrite for versions (if any versioning is required)\n\t\t\t\t\tif (versionOps.length || deleteOldVersionsOps.length) {\n\t\t\t\t\t\tawait ResolveIOServer.getMainDB().collection<T>(this.versionCollection).bulkWrite([...versionOps, ...deleteOldVersionsOps]);\n\t\t\t\t\t}\n\t\t\n\t\t\t\t\t// Separate bulkWrite for logs (if logging is enabled)\n\t\t\t\t\tif (!bypassLogs && logs.length) {\n\t\t\t\t\t\tawait Logs.bulkWrite(logs);\n\t\t\t\t\t}\n\t\t\n\t\t\t\t\tmonitor.finish();\n\t\n\t\t\t\t\tresolve(mainResult); // Resolve with the result of the main bulkWrite\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tresolve(null);\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tconsole.log(new Date(), 'Error Bulk Write', this.collectionName, bulkOps.slice(-100), options, err);\n\t\t\t\treject(err);\n\t\t\t}\n\t\t});\n\t}\n\n\tcountDocuments(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: CountDocumentsOptions): Promise<number> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('countDocuments', this.collectionName, JSON.stringify([filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).countDocuments(<any>filter, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Count Documents', this.collectionName, filter, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\t//Helper Function (1 or Many) - Not Real Mongo Function\n\tcreate(f_docs: T | T[], options?: InsertOneOptions | BulkWriteOptions): Promise<T | T[]> {\n\t\tif (!Array.isArray(f_docs)) {\n\t\t\treturn this.insertOne(f_docs, <InsertOneOptions>options);\n\t\t}\n\t\telse if (f_docs.length === 1) {\n\t\t\treturn this.insertOne(f_docs[0], <InsertOneOptions>options);\n\t\t}\n\n\t\treturn this.insertMany(f_docs, <BulkWriteOptions>options);\n\t}\n\n\tcreateIndex(fieldOrSpec: any, options?: CreateIndexesOptions): Promise<string> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tMongoManagerCollection.indexQueue.push({\n\t\t\t\taction: 'createIndex',\n\t\t\t\tcollection: this, // Current instance\n\t\t\t\tspecs: [fieldOrSpec],\n\t\t\t\toptions: options\n\t\t\t}, (err, result) => {\n\t\t\t\tif (err) reject(err);\n\t\t\t\telse resolve(result);\n\t\t\t});\n\t\t});\n\t}\n\t\n\tcreateIndexes(indexSpecs: IndexDescription[], options?: CreateIndexesOptions): Promise<string[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tMongoManagerCollection.indexQueue.push({\n\t\t\t\taction: 'createIndexes',\n\t\t\t\tcollection: this, // Current instance\n\t\t\t\tspecs: [indexSpecs],\n\t\t\t\toptions: options\n\t\t\t}, (err, result) => {\n\t\t\t\tif (err) reject(err);\n\t\t\t\telse resolve(result);\n\t\t\t});\n\t\t});\n\t}\n\n\tdeleteMany(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: DeleteOptions, bypassLogs = false): Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\tlet docs = await this.find(filter);\n\n\t\t\t\tfor (let i = 0; i < docs.length; i++) {\n\t\t\t\t\tlet doc = docs[i];\n\t\t\t\t\n\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, options])) < 200000 ? JSON.stringify([doc, filter, options], null, 2) : 'Too Big',\n\t\t\t\t\t\tmethod: 'deleteMany',\n\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\troute: ''\n\t\t\t\t\t});\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 1}}]});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('deleteMany', this.collectionName, JSON.stringify([filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).deleteMany(<any>filter, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\tresolve(res.deletedCount);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Delete Many', this.collectionName, filter, options, err);\n\t\t\t\treject(err)\n\t\t\t});\n\t\t});\n\t}\n\n\tdeleteOne(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOneAndDeleteOptions, bypassLogs = false): Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\tlet monitor = new MonitorMongo('findOneAndDelete', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndDelete(<any>filter, options).then(async returnVal => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tlet doc = returnVal;\n\n\t\t\t\t\tif (doc) {\n\t\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, options])) < 200000 ? JSON.stringify([doc, filter, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'deleteOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\t\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 1}}]});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\n\t\t\t\t\t\tresolve(1);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tresolve(0);\n\t\t\t\t\t}\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Find One And Delete', this.collectionName, filter, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet monitor = new MonitorMongo('deleteOne', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).deleteOne(<any>filter, options).then(res => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\tresolve(res.deletedCount);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t}\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Delete One', this.collectionName, filter, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\t\t\t\n\t\t});\n\t}\n\n\tdistinct(key: string, filter?: MongoManagerFilter<T> & MongoManagerFilterOperators<T>, options?: CommandOperationOptions): Promise<T[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('distinct', this.collectionName, JSON.stringify([key, filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).distinct(key, <any>filter, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Distinct', this.collectionName, filter, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tdrop(options?: CommandOperationOptions): Promise<boolean> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('drop', this.collectionName, JSON.stringify([options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).drop(options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Count Documents', this.collectionName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tdropIndex(indexName: string, options?: CommandOperationOptions): Promise<Document> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('dropIndex', this.collectionName, JSON.stringify([indexName, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).dropIndex(indexName, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(<Document>res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Drop Index', this.collectionName, indexName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tdropIndexes(options?: CommandOperationOptions): Promise<Boolean> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('dropIndexes', this.collectionName, JSON.stringify([options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).dropIndexes(options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Drop Indexes', this.collectionName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tfind(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>, skipCache = false): Promise<T[]> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!skipCache) {\n\t\t\t\tResolveIOServer.getMongoManager().find(this.collectionName, filter, options).then(res => {\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet monitor = new MonitorMongo('find', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).find<T>(<any>filter, options).toArray().then(res => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Find', this.collectionName, filter, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tfindById(id: string, options?: FindOptions<T>): Promise<T> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('findById', this.collectionName, JSON.stringify([{_id: id}, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOne<T>(<any>{_id: id}, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find By Id', this.collectionName, {_id: id}, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tfindCount(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>): Promise<Number> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('findCount', this.collectionName, JSON.stringify([filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).find(<any>filter, options).count().then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find Count', this.collectionName, filter, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tfindCursor(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>): FindCursor {\n\t\tlet monitor = new MonitorMongo('findCursor', this.collectionName, JSON.stringify([filter, options]));\n\t\tlet cursor = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).find(<any>filter, options);\n\t\tcursor.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\tcursor.removeAllListeners();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn cursor;\n\t}\n\n\tfindStream(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>, streamOptions?: CursorStreamOptions) {\n\t\tlet monitor = new MonitorMongo('findStream', this.collectionName, JSON.stringify([filter, options, streamOptions]));\n\t\tlet stream = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).find(<any>filter, options).stream(streamOptions);\n\t\tstream.on('end', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('error', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn stream;\n\t}\n\n\tfindOne(filter: MongoManagerFilter<T> | MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>, skipCache = false): Promise<T> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tif (!skipCache) {\n\t\t\t\tResolveIOServer.getMongoManager().findOne(this.collectionName, filter, options).then(res => {\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet monitor = new MonitorMongo('findOne', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOne<T>(<any>filter, options).then(res => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Find One', this.collectionName, filter, options, err);\n\t\t\t\t\treject(err)\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tfindOneAndDelete(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOneAndDeleteOptions, bypassLogs = false): Promise<T> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('findOneAndDelete', this.collectionName, JSON.stringify([filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndDelete(<any>filter, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tlet doc = res;\n\t\t\t\t\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, options])) < 200000 ? JSON.stringify([doc, filter, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'findOneAndDelete',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t}\n\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\n\t\t\t\t\tresolve(<T>doc);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tresolve(null);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find One And Delete', this.collectionName, filter, options, err);\n\t\t\t\treject(err)\n\t\t\t});\n\t\t});\n\t}\n\n\tfindOneAndReplace(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, replacement: T, options?: FindOneAndReplaceOptions, bypassLogs = false, bypassCheckSchema = false): Promise<T> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(replacement);\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - findOneAndReplace', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on findOneAndReplace - ' + this.collectionName, [validation.validationErrors(), replacement]);\n\t\t\t\t\t\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tlet date = new Date();\n\n\t\t\tif (this.timestamps) {\n\t\t\t\treplacement.updatedAt = date;\n\t\t\t}\n\n\t\t\tif (options && options.upsert) {\n\t\t\t\tif (!replacement._id) {\n\t\t\t\t\treplacement._id = objectIdHexString();\n\t\t\t\t}\n\n\t\t\t\tif (this.useVersions) {\n\t\t\t\t\treplacement.__v = 0;\n\t\t\t\t}\n\n\t\t\t\tif (this.timestamps && !replacement.createdAt) {\n\t\t\t\t\treplacement.createdAt = date;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('findOneAndReplace', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndReplace(<any>filter, replacement, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tlet doc = res;\n\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, replacement, options])) < 200000 ? JSON.stringify([doc, filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'findOneAndReplace',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t}\n\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\n\t\t\t\t\tresolve(<T>doc);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tresolve(null);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find One And Replace', this.collectionName, filter, options, err);\n\t\t\t\treject(err)\n\t\t\t});\n\t\t});\n\t}\n\n\tfindOneAndUpdate(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, update: MongoManagerUpdateFilter<T>, options?: FindOneAndUpdateOptions, bypassLogs = false, bypassCheckSchema = false): Promise<T> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(update, {modifier: true});\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - findOneAndUpdate', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on findOneAndUpdate - ' + this.collectionName, [validation.validationErrors(), update]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.timestamps) {\n\t\t\t\tlet date = new Date(); \n\t\t\t\t\n\t\t\t\tif (!update.$set) {\n\t\t\t\t\tupdate.$set = <any>{updatedAt: date};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tupdate.$set.updatedAt = date;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (options && options.upsert) {\n\t\t\t\tif (!update.$setOnInsert) {\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t_id: objectIdHexString()\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (!update.$setOnInsert._id) {\n\t\t\t\t\t\tupdate.$setOnInsert._id = objectIdHexString();\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.timestamps && !update.$setOnInsert.createdAt) {\n\t\t\t\t\t\tupdate.$setOnInsert.createdAt = new Date();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('findOneAndUpdate', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndUpdate(<any>filter, <any>update, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tlet doc = res;\n\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\t\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, options])) < 200000 ? JSON.stringify([doc, filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'findOneAndUpdate',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t}\n\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\n\t\t\t\t\tresolve(<T>doc);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tresolve(null);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find One And Update', this.collectionName, filter, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tindexes(options: IndexInformationOptions): Promise<any[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('indexes', this.collectionName, JSON.stringify([options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).indexes(options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Indexes', this.collectionName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tindexExists(indexes: string | string[], options?: IndexInformationOptions): Promise<boolean> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('indexExists', this.collectionName, JSON.stringify([indexes, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).indexExists(indexes, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Index Exists', this.collectionName, indexes, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tinsertMany(docs: T[], options?: BulkWriteOptions, bypassLogs = false, bypassCheckSchema = false, bypassMonitor = false): Promise<T[]> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!docs.length) {\n\t\t\t\tresolve([]);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tlet validationResults = [];\n\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tdocs.forEach(doc => {\n\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\tconst isValid = validation.validate(doc);\n\n\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - insertMany', validation.validationErrors());\n\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on insertMany - ' + this.collectionName, [validation.validationErrors(), doc]);\n\t\t\t\t\t\tvalidationResults.push(false);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tvalidationResults.push(true);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlet validDocs = this.checkSchema ? docs.filter((a, idx) => validationResults[idx]) : docs;\n\n\t\t\tfor (let i = 0; i < validDocs.length; i++) {\n\t\t\t\tlet doc = validDocs[i];\n\n\t\t\t\tif (!doc._id) {\n\t\t\t\t\tdoc._id = objectIdHexString();\n\t\t\t\t}\n\n\t\t\t\tif (this.timestamps) {\n\t\t\t\t\tlet date = new Date();\n\n\t\t\t\t\tif (!doc.createdAt) {\n\t\t\t\t\t\tdoc.createdAt = date;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!doc.updatedAt) {\n\t\t\t\t\t\tdoc.updatedAt = date;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this.useVersions && !doc.hasOwnProperty('__v')) {\n\t\t\t\t\tdoc.__v = 0;\n\t\t\t\t}\n\n\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, options])) < 200000 ? JSON.stringify([doc, options], null, 2) : 'Too Big',\n\t\t\t\t\t\tmethod: 'insertMany',\n\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\troute: ''\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (validDocs.length) {\n\t\t\t\tlet monitor = null;\n\t\t\t\t\n\t\t\t\tif (!bypassMonitor) {\n\t\t\t\t\tmonitor = new MonitorMongo('insertMany', this.collectionName, JSON.stringify([validDocs, options]));\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).insertMany(<OptionalUnlessRequiredId<T>[]>validDocs, options).then(res => {\n\t\t\t\t\tif (monitor) {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t}\n\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\tresolve(validDocs);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t}\n\t\t\t\t}, err => {\n\t\t\t\t\tif (monitor) {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t}\n\t\t\t\t\tconsole.log(new Date(), 'Error Insert Many', this.collectionName, validDocs, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tinsertOne(doc: T, options?: InsertOneOptions, bypassLogs = false, bypassCheckSchema = false): Promise<T> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!doc._id) {\n\t\t\t\tdoc._id = objectIdHexString();\n\t\t\t}\n\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(doc);\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - insertOne', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on insertOne - ' + this.collectionName, [validation.validationErrors(), doc]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.timestamps) {\n\t\t\t\tlet date = new Date();\n\t\t\t\n\t\t\t\tif (!doc.createdAt) {\n\t\t\t\t\tdoc.createdAt = date;\n\t\t\t\t}\n\n\t\t\t\tif (!doc.updatedAt) {\n\t\t\t\t\tdoc.updatedAt = date;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\tLogs.insertOne({\n\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\ttype: 'document',\n\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, options])) < 200000 ? JSON.stringify([doc, options], null, 2) : 'Too Big',\n\t\t\t\t\tmethod: 'insertOne',\n\t\t\t\t\tid_user: '',\n\t\t\t\t\tuser: '',\n\t\t\t\t\tmessageId: 0,\n\t\t\t\t\troute: ''\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (this.useVersions && !doc.hasOwnProperty('__v')) {\n\t\t\t\tdoc.__v = 0;\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('insertOne', this.collectionName, JSON.stringify([doc, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).insertOne(<OptionalUnlessRequiredId<T>>doc, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\tresolve(doc);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Insert One', this.collectionName, doc, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tlistIndexes(options?: ListIndexesOptions): ListIndexesCursor {\n\t\tlet monitor = new MonitorMongo('listIndexes', this.collectionName, JSON.stringify([options]));\n\t\tlet cursor = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).listIndexes(options);\n\t\tcursor.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn cursor;\n\t}\n\n\trename(newName: string, options?: RenameOptions): Promise<Collection<Document>> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('rename', this.collectionName, JSON.stringify([newName, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).rename(newName, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Rename', this.collectionName, newName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\treplaceOne(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T>, replacement: T, options?: ReplaceOptions, bypassLogs = false, bypassCheckSchema = false, doc: T = null) : Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(replacement);\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - replaceOne', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on replaceOne - ' + this.collectionName, [validation.validationErrors(), replacement]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tlet date = new Date();\n\t\t\t\n\t\t\tif (this.timestamps) {\n\t\t\t\treplacement.updatedAt = date;\n\t\t\t}\n\n\t\t\tif (this.useVersions) {\n\t\t\t\tif (!doc) {\n\t\t\t\t\tdoc = await this.findOne(<any>filter, null, true);\n\t\t\t\t}\n\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.timestamps && !replacement.createdAt && doc.createdAt) {\n\t\t\t\t\t\treplacement.createdAt = doc.createdAt;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (doc.__v === replacement.__v) {\n\t\t\t\t\t\treplacement.__v += 1;\n\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\n\t\t\t\t\t\tif (doc.__v >= 4) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 4}}]});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, replacement, options])) < 200000 ? JSON.stringify([doc, filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tlet monitor = new MonitorMongo('replaceOne', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).replaceOne(<any>filter, replacement, options).then(res => {\n\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, err => {\n\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\tconsole.log(new Date(), 'Error Replace One', this.collectionName, filter, replacement, options, err);\n\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tconsole.log('invalid version - ' + this.collectionName, doc.__v, replacement.__v);\n\n\t\t\t\t\t\tlet prevDoc = await ResolveIOServer.getMongoManager().collection(this.versionCollection).findOne({\n\t\t\t\t\t\t\t_id: <any>{\n\t\t\t\t\t\t\t\t_id: doc._id,\n\t\t\t\t\t\t\t\t__v: replacement.__v\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, null, true);\n\n\t\t\t\t\t\tif (prevDoc) {\n\t\t\t\t\t\t\tlet docId = doc._id;\n\t\t\t\t\t\t\tlet docVersion = doc.__v;\n\t\t\t\t\t\t\tlet updatedDoc: T = getMongoMergeUpdatedDoc(replacement, doc, prevDoc);\n\t\t\t\t\t\t\tupdatedDoc._id = docId;\n\t\t\t\t\t\t\tupdatedDoc.__v = docVersion + 1;\n\n\t\t\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\tid_document: docId,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['invalidVersion - merge', doc, filter, updatedDoc, options])) < 200000 ? JSON.stringify(['invalidVersion - merge', doc, filter, updatedDoc, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tlet monitor = new MonitorMongo('replaceOne', this.collectionName, JSON.stringify([filter, updatedDoc, options]));\n\t\t\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).replaceOne(<any>filter, updatedDoc, options).then(res => {\n\t\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}, err => {\n\t\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\t\tconsole.log(new Date(), 'Error Replace One', this.collectionName, filter, updatedDoc, options, err);\n\t\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject('Invalid Version And Could Not Find History - DB: ' + doc.__v + ', Trying to update with :' + replacement.__v);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (options && options.upsert) {\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\treplacement.createdAt = date;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!replacement._id) {\n\t\t\t\t\t\treplacement._id = objectIdHexString();\n\t\t\t\t\t}\n\n\t\t\t\t\treplacement.__v = 0;\n\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: replacement._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, replacement, options])) < 200000 ? JSON.stringify(['upsert', filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tlet monitor = new MonitorMongo('replaceOne', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).replaceOne(<any>filter, replacement, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Replace One', this.collectionName, filter, replacement, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject('No Document');\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (options && options.upsert) {\n\t\t\t\t\tif (this.timestamps && !replacement.createdAt) {\n\t\t\t\t\t\treplacement.createdAt = date;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!replacement._id) {\n\t\t\t\t\t\treplacement._id = objectIdHexString();\n\t\t\t\t\t}\n\n\t\t\t\t\treplacement.__v = 0;\n\t\t\t\t}\n\n\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\tif (!options) {\n\t\t\t\t\t\toptions = <FindOneAndReplaceOptions>{returnDocument: 'before'};\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t(<FindOneAndReplaceOptions>options).returnDocument = 'before';\n\t\t\t\t\t}\n\n\t\t\t\t\tlet monitor = new MonitorMongo('findOneAndReplace', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndReplace(<any>filter, replacement, <FindOneAndReplaceOptions>options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tlet doc = res;\n\n\t\t\t\t\t\tif (doc) {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, replacement, options])) < 200000 ? JSON.stringify([doc, filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: replacement._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, replacement, options])) < 200000 ? JSON.stringify(['upsert', filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\tresolve(1);\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Find One And Replace', this.collectionName, filter, replacement, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlet monitor = new MonitorMongo('replaceOne', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).replaceOne(<any>filter, replacement, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Replace One', this.collectionName, filter, replacement, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tupdateMany(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T>, update: MongoManagerUpdateFilter<T>, options?: UpdateOptions, bypassLogs = false, bypassCheckSchema = false, bypassVersions = false) : Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif ((!update.$inc || JSON.stringify(update.$inc) === '{}') && (!update.$set || JSON.stringify(update.$set) === '{}') && (!update.$setOnInsert || JSON.stringify(update.$setOnInsert) === '{}') && (!update.$unset || JSON.stringify(update.$unset) === '{}')) {\n\t\t\t\tresolve(1);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tif (this.timestamps) {\n\t\t\t\tlet date = new Date();\n\n\t\t\t\tif (!update.$set) {\n\t\t\t\t\tupdate.$set = <any>{updatedAt: date};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tupdate.$set.updatedAt = date;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(update, {modifier: true});\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - updateMany', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on updateMany - ' + this.collectionName, [validation.validationErrors(), update]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ((this.useVersions && !bypassVersions) || (this.createLogs && !bypassLogs)) {\n\t\t\t\tlet docs = await this.find(filter);\n\t\n\t\t\t\tfor (let i = 0; i < docs.length; i++) {\n\t\t\t\t\tlet doc = docs[i];\n\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, options])) < 200000 ? JSON.stringify([doc, filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'updateMany',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\t\t\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (doc.__v >= 4) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 4}}]});\n\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\tif (!objectContainsPropertyDeep(update, '__v')) {\n\t\t\t\t\t\t\tif (!update.$inc) {\n\t\t\t\t\t\t\t\tupdate.$inc = {__v: 1};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (!update.$inc.__v) {\n\t\t\t\t\t\t\t\tupdate.$inc.__v = 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('updateMany', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).updateMany(<any>filter, update, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Update Many', this.collectionName, filter, update, options, err);\n\t\t\t\treject(err)\n\t\t\t});\n\t\t});\n\t}\n\n\tupdateOne(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T>, update: MongoManagerUpdateFilter<T>, options?: UpdateOptions, bypassLogs = false, bypassCheckSchema = false) : Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\t\t\t\n\t\t\t\tconst isValid = validation.validate(update, {modifier: true});\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - updateOne', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on updateOne - ' + this.collectionName, [validation.validationErrors(), update]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ((!update.$inc || JSON.stringify(update.$inc) === '{}') && (!update.$set || JSON.stringify(update.$set) === '{}') && (!update.$setOnInsert || JSON.stringify(update.$setOnInsert) === '{}') && (!update.$unset || JSON.stringify(update.$unset) === '{}')) {\n\t\t\t\tresolve(1);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet date = new Date();\n\n\t\t\tif (this.timestamps) {\n\t\t\t\tif (!update.$set) {\n\t\t\t\t\tupdate.$set = <any>{updatedAt: date};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tupdate.$set.updatedAt = date;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif (this.useVersions) {\n\t\t\t\tlet doc = await this.findOne(filter, null, true);\n\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, options])) < 200000 ? JSON.stringify([doc, filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\t\n\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t\n\t\t\t\t\tif (doc.__v >= 4) {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 4}}]});\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (!objectContainsPropertyDeep(update, '__v')) {\n\t\t\t\t\t\tif (!update.$inc) {\n\t\t\t\t\t\t\tupdate.$inc = {__v: 1};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (!update.$inc.__v) {\n\t\t\t\t\t\t\tupdate.$inc.__v = 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tlet monitor = new MonitorMongo('updateOne', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).updateOne(<any>filter, update, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Update One', this.collectionName, filter, update, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (options && options.upsert) {\n\t\t\t\t\tif (!update.$setOnInsert) {\n\t\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t__v: 0,\n\t\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t__v: 0\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (!update.$setOnInsert._id) {\n\t\t\t\t\t\t\tupdate.$setOnInsert._id = objectIdHexString();\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif (this.timestamps && !update.$setOnInsert.createdAt) {\n\t\t\t\t\t\t\tupdate.$setOnInsert.createdAt = new Date();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: update.$setOnInsert._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, update, options])) < 200000 ? JSON.stringify(['upsert', filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tlet monitor = new MonitorMongo('updateOne', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).updateOne(<any>filter, update, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Update One', this.collectionName, filter, update, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject('No Document');\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (options && options.upsert) {\n\t\t\t\t\tif (!update.$setOnInsert) {\n\t\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString()\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (!update.$setOnInsert._id) {\n\t\t\t\t\t\t\tupdate.$setOnInsert._id = objectIdHexString();\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif (this.timestamps && !update.$setOnInsert.createdAt) {\n\t\t\t\t\t\t\tupdate.$setOnInsert.createdAt = new Date();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\tif (!options) {\n\t\t\t\t\t\toptions = <FindOneAndUpdateOptions>{returnDocument: 'before'};\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t(<FindOneAndUpdateOptions>options).returnDocument = 'before';\n\t\t\t\t\t}\n\n\t\t\t\t\tlet monitor = new MonitorMongo('findOneAndUpdate', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).findOneAndUpdate(<any>filter, update, <FindOneAndUpdateOptions>options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tlet doc = res.value;\n\n\t\t\t\t\t\tif (doc) {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: <any>doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, options])) < 200000 ? JSON.stringify([doc, filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tresolve(res.ok);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (update.$setOnInsert) {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: update.$setOnInsert._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, update, options])) < 200000 ? JSON.stringify(['upsert', filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\n\t\t\t\t\t\t\tresolve(res.ok);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tresolve(0);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Find One And Update', this.collectionName, filter, update, options, err);\n\t\t\t\t\t\treject(err)\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlet monitor = new MonitorMongo('updateOne', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).updateOne(<any>filter, update, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Update One', this.collectionName, filter, update, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\t\n\twatchCollection(pipeline = [], options?: ChangeStreamOptions): ChangeStream<T> {\n\t\tlet stream = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).watch(pipeline, options);\n\t\treturn <ChangeStream<T>>stream;\n\t}\n}\n\nexport class MongoManagerUserCollection<T extends CollectionDocument> extends MongoManagerCollection<T> {\n\tauthenticate(user: UserModel, password: string): Promise<{data: UserModel, error: string}> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tconst attemptsInterval = Math.pow(100, Math.log(user.attempts + 1));\n\t\t\tconst calculatedInterval = attemptsInterval < 300000 ? attemptsInterval : 300000;\n\t\t\n\t\t\tif (user.last) {\n\t\t\t\tif (Date.now() - user.last.getTime() < calculatedInterval) {\n\t\t\t\t\tuser.last = new Date();\n\t\t\t\t\tawait Users.updateOne({_id: user._id}, {$set: {last: user.last}});\n\t\t\t\t\tresolve({\n\t\t\t\t\t\tdata: null,\n\t\t\t\t\t\terror: 'Attempt Too Soon'\n\t\t\t\t\t});\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tuser.last = new Date();\n\t\t\t}\n\t\t\n\t\t\tif (user.attempts >= 5) {\n\t\t\t\tresolve({\n\t\t\t\t\tdata: null,\n\t\t\t\t\terror: 'Too Many Attempts'\n\t\t\t\t});\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tif (!user.salt) {\n\t\t\t\tresolve({\n\t\t\t\t\tdata: null,\n\t\t\t\t\terror: 'No Salt Value Stored'\n\t\t\t\t});\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tpbkdf2(password, user.salt, {\n\t\t\t\titerations: 25000,\n\t\t\t\tkeylen: 512,\n\t\t\t\tdigestAlgorithm: 'sha256'\n\t\t\t}, async (err, hashBuffer) => {\n\t\t\t\tif (err) {\n\t\t\t\t\treturn reject(err);\n\t\t\t\t}\n\t\t\t\n\t\t\t\tif (scmp(hashBuffer, Buffer.from(user.hash, 'hex'))) {\n\t\t\t\t\tuser.last = new Date();\n\t\t\t\t\tuser.attempts = 0;\n\t\t\t\t\tawait Users.updateOne({_id: user._id}, {$set: {last: user.last, attempts: user.attempts}});\n\n\t\t\t\t\tresolve({\n\t\t\t\t\t\tdata: user,\n\t\t\t\t\t\terror: ''\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tuser.last = new Date();\n\t\t\t\t\tuser.attempts = user.attempts + 1;\n\t\t\t\t\tawait Users.updateOne({_id: user._id}, {$set: {last: user.last, attempts: user.attempts}});\n\n\t\t\t\t\tif (user.attempts >= 5) {\n\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\tdata: null,\n\t\t\t\t\t\t\terror: 'Too Many Attempts'\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\tdata: null,\n\t\t\t\t\t\t\terror: 'Invalid Username And Password'\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t});\n\t\t});\n\t}\n\n\tserializeUser() {\n\t\treturn (user, cb) => {\n\t\t\tcb(null, user.username);\n\t\t};\n\t}\n\n\tdeserializeUser() {\n\t\treturn (username, cb) => {\n\t\t\tUsers.findOne({username: username}).then(res => {\n\t\t\t\tcb(null, res);\n\t\t\t}, err => {\n\t\t\t\tcb(err, null);\n\t\t\t});\n\t\t};\n\t}\n\n\tsetPassword(user: UserModel, password: string) {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!user) {\n\t\t\t\treject('No User');\n\t\t\t}\n\t\t\telse if (!password) {\n\t\t\t\treject('No Password');\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet saltBuffer = await randomBytes(32);\n\t\t\t\tlet salt = saltBuffer.toString('hex');\n\t\t\t\tlet hashRaw = await pbkdf2Promisified(password, salt, {\n\t\t\t\t\titerations: 25000,\n\t\t\t\t\tkeylen: 512,\n\t\t\t\t\tdigestAlgorithm: 'sha256'\n\t\t\t\t});\n\t\t\t\tlet hash = Buffer.from(hashRaw, 'binary').toString('hex');\n\t\t\t\tUsers.updateOne({_id: user._id}, {$set: {hash: hash, salt: salt, services: {}, attempts: 0}}).then(res => resolve(res), rej => reject(rej));\n\t\t\t}\n\t\t});\n\t};\n\n\tchangePassword(user, oldPassword, newPassword) {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!user) {\n\t\t\t\treject('Missing User');\n\t\t\t}\n\t\t\telse if (!oldPassword || !newPassword) {\n\t\t\t\treject('Missing Password');\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet authUser = await this.authenticate(user, oldPassword);\n\n\t\t\t\tif (!authUser['data']) {\n\t\t\t\t\treject(authUser['error']);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.setPassword(user, newPassword).then(res => resolve(res), rej => reject(rej));\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\t\n\tregister(user, password) {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!user.username) {\n\t\t\t\treject('Missing Username');\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet dbUser = await Users.findOne({username: user.username});\n\t\t\t\t\n\t\t\t\tif (dbUser) {\n\t\t\t\t\treject('Username Exists');\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tdbUser = await Users.findOne({email: user.email});\n\n\t\t\t\t\tif (dbUser) {\n\t\t\t\t\t\treject('Email Exists');\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tuser.setPassword(password);\n\t\t\t\t\t\tresolve(user);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tresetAttempts(user: UserModel) {\n\t\treturn Users.updateOne({_id: user._id}, {$set: {attempts: 0}});\n\t}\n}\n\nexport function objectIdHexString() {\n\tlet objectId = new ObjectId();\n\treturn objectId.toHexString();\n}\n\nfunction pbkdf2(password, salt, options, callback) {\n\tcrypto.pbkdf2(password, salt, options.iterations, options.keylen, options.digestAlgorithm, callback);\n};\n\nfunction pbkdf2Promisified(password, salt, options): Promise<any> {\n\treturn new Promise((resolve, reject) => pbkdf2(password, salt, options, (err, hashRaw) => (err ? reject(err) : resolve(hashRaw))));\n}\n\nfunction randomBytes(saltlen): Promise<Buffer> {\n\treturn new Promise((resolve, reject) => crypto.randomBytes(saltlen, (err, saltBuffer) => (err ? reject(err) : resolve(saltBuffer))));\n}\n\nfunction objectContainsPropertyDeep(obj: Object, prop: string) {\n\tlet keys = Object.keys(obj);\n\n\tif (keys.some(a => a === prop)) {\n\t\treturn true;\n\t}\n\t\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tlet key = keys[i];\n\t\tif (obj[key] && typeof obj[key] === 'object' && objectContainsPropertyDeep(obj[key], prop)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}"]}
1
+ {"version":3,"sources":["../../src/managers/mongo.manager.ts"],"names":["simpl_schema_1","require","mongodb_1","index_1","user_collection_1","common_1","log_collection_1","NodeCache","crypto","scmp","monitor_manager_1","os_1","numCPUs","cpus","length","v8","async_1","MongoManager","serverConfig","_this","this","_collections","_cacheMap","_heapSize","getHeapStatistics","_serverCollections","_debugRemoveCacheHits","_debugMongoQueueCollections","_serverConfig","_isWorkersEnabled","_isWorkerInstance","_nodeCache","stdTTL","checkperiod","process","env","IS_WORKERS_ENABLED","IS_WORKER_INSTANCE","setCacheLimit","setInterval","ResolveIOServer","getMainServer","getSubscriptionManager","getEnableDebug","console","log","Date","JSON","stringify","initServerCollections","setupChangeStream","prototype","_heapLimit","getMainDB","listCollections","toArray","collections","_a","sent","getServerCollections","registerCollection","collection","collectionOptions","timeseries","timeField","some","a","name","collectionName","type","dropCollection","then","createCollection","push","find","filter","options","cacheKey","generateCacheKey","undefined","result","getFromCache","monitor","MonitorMongo","finish","addToCache","error","error_1","findOne","error_2","aggregate","pipeline","error_3","functionName","args","keyString","createHash","update","digest","cachedData","get","parse","dateReviver","del","data","getBinarySize","nodeCacheSize","getStats","vsize","deleteCount","_i","keys_1","keys","key","set","invalidateQueryCache","collectionCacheMap_1","cacheMap","changeStream","getMongoConnection","db","watch","on","change","__awaiter","coll","err","close","setTimeout","MongoManagerModel","exports","versionOptions","collection_main","collection_version","MongoManagerUserCollection","MongoManagerCollection","useVersionCollection","useVersions","versionSchema","deepCopy","schema","_id","blackbox","useReportBuilder","reportBuilderLookupTables","timestamps","createLogs","checkSchema","createIndex","_id._id","_id.__v","versionCollection","schemaCopy","interval","simplschema","rbSchema","useRB","default","buildRbLookups","buildRbSchema","getMongoManager","clearInterval","extractIndexNameFromError","errorMessage","matches","match","skipCache","Promise","resolve","reject","monitor_1","res","aggregateCount","aggregateCursor","cursor","ev","aggregateStream","streamOptions","stream","bulkWrite","operations","bypassLogs","bypassCheckSchema","logs","versionOps","deleteOldVersionsOps","bulkOps","updateFilters","updateManyFilters","deleteManyFilters","forEach","op","opType","Object","$or","__spreadArray","_b","_c","currentDocs","getNestedValue","doc","split","reduce","acc","part","Array","isArray","map","item","val","findMatchingDocs","matchDocument","every","value","docValue","subFilter","evaluateCondition","condition","$in","includes","$nin","$ne","$gt","$gte","$lt","$lte","$exists","RegExp","$regex","$options","test","date","document","objectIdHexString","this_1","hasOwnProperty","__v","createdAt","updatedAt","validation","newContext","validate","validationErrors","getMethodManager","callMethodInternal","call","insertOne","id_document","payload","method","id_user","user","messageId","route","matchingDocs","_d","matchingDocs_1","currentDoc","$set","modifier","versionDoc","objectContainsPropertyDeep","$inc","deleteMany","upsert","$setOnInsert","replacement","_e","matchingDocs_2","_f","matchingDocs_3","operations_1","slice","mainResult","Logs","err_1","countDocuments","create","f_docs","insertMany","fieldOrSpec","indexQueue","action","specs","createIndexes","indexSpecs","docs","i","replaceOne","$and","acknowledged","deletedCount","deleteOne","monitor_2","findOneAndDelete","returnVal","monitor_3","distinct","drop","dropIndex","indexName","dropIndexes","monitor_4","findById","id","findCount","count","findCursor","removeAllListeners","findStream","monitor_5","findOneAndReplace","findOneAndUpdate","indexes","indexExists","bypassMonitor","validationResults","validDocs","idx","monitor_6","listIndexes","rename","newName","monitor_7","modifiedCount","prevDoc","docId","docVersion","updatedDoc_1","getMongoMergeUpdatedDoc","monitor_8","monitor_9","returnDocument","monitor_10","monitor_11","updateMany","bypassVersions","$unset","updateOne","monitor_12","monitor_13","monitor_14","ok","monitor_15","watchCollection","queue","task","callback","dbCollection","apply","code","err_2","message","existingIndexName","innerError_1","Error","concat","_super","__extends","authenticate","password","attemptsInterval","Math","pow","attempts","calculatedInterval","last","now","getTime","Users","salt","pbkdf2","iterations","keylen","digestAlgorithm","hashBuffer","Buffer","from","hash","serializeUser","cb","username","deserializeUser","setPassword","randomBytes","saltBuffer","toString","pbkdf2Promisified","hashRaw","services","rej","changePassword","oldPassword","newPassword","authUser","register","email","resetAttempts","ObjectId","toHexString","saltlen","obj","prop"],"mappings":"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","file":"mongo.manager.js","sourcesContent":["import SimpleSchema from 'simpl-schema';\nimport { AggregateOptions, AggregationCursor, BulkWriteOptions, ChangeStream, ChangeStreamOptions, CommandOperationOptions, CountDocumentsOptions, CreateCollectionOptions, CreateIndexesOptions, CursorStreamOptions, DeleteOptions, Filter, FindCursor, FindOneAndDeleteOptions, FindOneAndReplaceOptions, FindOneAndUpdateOptions, FindOptions, IndexDescription, IndexInformationOptions, InsertOneOptions, ListIndexesCursor, ListIndexesOptions, ObjectId, RenameOptions, ReplaceOptions, UpdateOptions, OptionalId, Collection, CollectionInfo, OptionalUnlessRequiredId, AnyBulkWriteOperation, BulkWriteResult, DbStatsOptions } from 'mongodb';\nimport { LookupTables } from '../models/report-builder.model';\nimport { ResolveIOServer } from '../index';\nimport { Users } from '../collections/user.collection';\nimport { buildRbLookups, buildRbSchema, dateReviver, deepCopy, getBinarySize, getMongoMergeUpdatedDoc } from '../util/common';\nimport { UserModel } from '../models/user.model';\nimport { Logs } from '../collections/log.collection';\nimport * as NodeCache from 'node-cache';\nconst crypto = require('crypto');\nconst scmp = require('scmp');\nimport { MonitorMongo } from './monitor.manager';\nimport { CollectionDocument, Document } from '../models/collection-document.model';\nimport { cpus } from 'os';\nconst numCPUs = cpus().length;\nconst v8 = require('v8');\nimport async from 'async';\n\ninterface MongoQueueModel {\n\t_id: number,\n\tname_collection: string;\n\tlookup_collections: string[];\n\tname_function: string;\n\tdata_function: any[];\n\tname_function_addt: string;\n\tdata_function_addt: any[];\n\tcbs: Function[];\n\tcbs_next: Function[];\n\trunning: boolean;\n\tcacheId: number;\n\tinvalidateFlag: boolean;\n\tinvalidateCount: number;\n}\n\n// export declare interface MongoManagerFilterOperators<T> extends Document {\nexport declare interface MongoManagerFilterParamaterOperators<P> {\n\t$eq?: P;\n $gt?: P;\n $gte?: P;\n $in?: P extends Array<any> ? P : P[];\n $lt?: P;\n $lte?: P;\n $ne?: P;\n $nin?: P extends Array<any> ? P : P[];\n $not?: P extends string ? MongoManagerFilterParamaterOperators<P> | RegExpConstructor : MongoManagerFilterParamaterOperators<P>;\n $exists?: boolean;\n $expr?: any[]\n $regex?: P extends string ? RegExpConstructor | string : never;\n $options?: P extends string ? string : never;\n $geoIntersects?: {\n $geometry: Document;\n };\n $geoWithin?: Document;\n $near?: Document;\n $nearSphere?: Document;\n $maxDistance?: number;\n $all?: any[];\n $elemMatch?: Document;\n $size?: P extends any[] ? number : never;\n}\n\nexport declare interface MongoManagerFilterOperators<T> extends Document { //TODO: Remove extends document when I get answer on S.O.\n $and?: MongoManagerFilter<T>[] | MongoManagerFilterOperators<T>;\n $nor?: MongoManagerFilter<T>[] | MongoManagerFilterOperators<T>;\n $or?: MongoManagerFilter<T>[] | MongoManagerFilterOperators<T>;\n $text?: {\n $search: string;\n $language?: string;\n $caseSensitive?: boolean;\n $diacriticSensitive?: boolean;\n };\n $where?: string | ((this: T) => boolean);\n $comment?: string | Document;\n}\n\n// function isDotStringRegExp(obj: Object, dotKey: string): boolean {\n// \tlet keyData = dotKey.split('.');\n// \tlet objData = obj;\n\t\n// \tfor (let i = 0; i < keyData.length; i++) {\n// \t\tlet key = keyData[i];\n// \t\tif (objData.hasOwnProperty(key)) {\n// \t\t\tobjData = objData[key];\n\t\t\t\n// \t\t\tif (i === keyData.length - 1) {\n// \t\t\t\treturn true;\n// \t\t\t}\n// \t\t}\n// \t\telse {\n// \t\t\treturn false;\n// \t\t}\n// \t}\n// }\n\n// export declare type MongoManagerDotStringFilter<T> = {\n// \t[key: string]: (isDotStringRegExp(T, key) ? any : never);\n// };\n\nexport declare type MongoManagerFilter<T> = {\n\t[P in keyof T]?: T[P] | MongoManagerFilterParamaterOperators<T[P]>;\n};\n\nexport declare type MongoManagerUnsetFilter<T> = {\n\t[P in keyof T]?: number | boolean;\n};\n\nexport declare type MongoManagerIncFilter<T> = {\n\t[P in keyof T]?: number;\n};\n\nexport declare type MongoManagerUpdateFilter<T> = {\n $inc?: MongoManagerIncFilter<T> | Document;\n $set?: MongoManagerFilter<T> | Document;\n $setOnInsert?: MongoManagerFilter<T> | Document;\n $unset?: MongoManagerUnsetFilter<T> | Document;\n};\n\nexport class MongoManager {\n\tprivate _collections: MongoManagerCollection<CollectionDocument>[] = [];\n\tprivate _nodeCache;\n\tprivate _cacheMap = [];\n\n\tprivate _heapSize = v8.getHeapStatistics() / numCPUs;\n\tprivate _heapLimit: number;\n\n\tprivate _serverCollections: (CollectionInfo | Pick<CollectionInfo, 'name' | 'type'>)[] = [];\n\n\tprivate _debugRemoveCacheHits = 0;\n\tprivate _debugMongoQueueCollections = [];\n\tprivate _serverConfig = null;\n\tprivate _isWorkersEnabled = false;\n\tprivate _isWorkerInstance = false;\n\n\tconstructor(serverConfig) {\n\t\tthis._serverConfig = serverConfig;\n\t\tthis._nodeCache = new NodeCache({ stdTTL: 0, checkperiod: 0 });\n\n\t\tthis._isWorkersEnabled = process.env.IS_WORKERS_ENABLED === 'true';\n\t\tthis._isWorkerInstance = process.env.IS_WORKER_INSTANCE === 'true';\n\n\t\t// Adjust cache size based on environment variables\n\t\tthis.setCacheLimit();\n\n\t\tsetInterval(() => {\n\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Mongo Manager', 'Collections', this._collections.length);\n\t\t\t\tconsole.log(new Date(), 'Mongo Manager', 'Server Collections', this._serverCollections.length);\n\t\t\t\tconsole.log(new Date(), 'Mongo Manager', 'Cache Cleanup Hits', JSON.stringify(this._debugRemoveCacheHits, null, 2));\n\t\t\t}\n\n\t\t\tthis._debugRemoveCacheHits = 0;\n\t\t\tthis._debugMongoQueueCollections = [];\n\t\t}, 60000);\n\n\t\tthis.initServerCollections();\n\n\t\tif (this._isWorkersEnabled && this._isWorkerInstance) {\n\t\t\tthis.setupChangeStream();\n\t\t}\n\t}\n\n\tprivate setCacheLimit() {\n\t\tif (this._isWorkersEnabled) {\n\t\t\tif (this._isWorkerInstance) {\n\t\t\t\tthis._heapLimit = this._heapSize * 0.8;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis._heapLimit = this._heapSize * 0.4;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tthis._heapLimit = this._heapSize * 0.3;\n\t\t}\n\t}\n\n\tasync initServerCollections() {\n\t\tlet collections = await ResolveIOServer.getMainDB().listCollections().toArray();\n\t\tthis._serverCollections = collections;\n\t}\n\n\tgetServerCollections() {\n\t\treturn this._serverCollections;\n\t}\n\n\tregisterCollection(collection: MongoManagerCollection<CollectionDocument>) {\n\t\tif (\n\t\t\tcollection.collectionOptions &&\n\t\t\tcollection.collectionOptions.timeseries &&\n\t\t\tcollection.collectionOptions.timeseries.timeField &&\n\t\t\tthis._serverCollections.some(a => a.name === collection.collectionName && a.type === 'collection')\n\t\t) {\n\t\t\tResolveIOServer.getMainDB()\n\t\t\t\t.dropCollection(collection.collectionName)\n\t\t\t\t.then(() => {\n\t\t\t\t\tthis.createCollection(collection);\n\t\t\t\t});\n\t\t}\n\n\t\tthis._collections.push(collection);\n\t}\n\n\tcreateCollection(collection: MongoManagerCollection<CollectionDocument>) {\n\t\tResolveIOServer.getMainDB().createCollection<CollectionDocument>(collection.collectionName, collection.collectionOptions);\n\t}\n\n\tcollections() {\n\t\treturn this._collections;\n\t}\n\n\tcollection(collectionName: string): MongoManagerCollection<CollectionDocument> | MongoManagerUserCollection<CollectionDocument> {\n\t\treturn this._collections.find(a => a.collectionName === collectionName);\n\t}\n\n\tpublic async find<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {},\n\t\toptions?: FindOptions<T>\n\t): Promise<T[]> {\n\t\ttry {\n\t\t\tconst cacheKey = this.generateCacheKey(collectionName, 'find', [filter, options]);\n\t\t\tlet result = this.getFromCache(cacheKey);\n\t\t\tif (result !== undefined) {\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\tconst monitor = new MonitorMongo('find', collectionName, JSON.stringify([filter, options]));\n\t\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\t\t\tresult = await collection.find(<any>filter, options).toArray();\n\t\t\tmonitor.finish();\n\n\t\t\tthis.addToCache(collectionName, cacheKey, result);\n\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tconsole.error(new Date(), 'Error in find', collectionName, error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tpublic async findOne<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> | MongoManagerFilterOperators<T> = {},\n\t\toptions?: FindOptions<T>\n\t): Promise<T> {\n\t\ttry {\n\t\t\tconst cacheKey = this.generateCacheKey(collectionName, 'findOne', [filter, options]);\n\t\t\tlet result = this.getFromCache(cacheKey);\n\t\t\tif (result !== undefined) {\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\tconst monitor = new MonitorMongo('find', collectionName, JSON.stringify([filter, options]));\n\t\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\t\t\tresult = await collection.findOne(<any>filter, options);\n\t\t\tmonitor.finish();\n\n\t\t\tthis.addToCache(collectionName, cacheKey, result);\n\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tconsole.error(new Date(), 'Error in find', collectionName, error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tpublic async aggregate<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tpipeline: any[],\n\t\toptions?: AggregateOptions\n\t): Promise<any[]> {\n\t\ttry {\n\t\t\tconst cacheKey = this.generateCacheKey(collectionName, 'aggregate', [pipeline, options]);\n\t\t\tlet result = this.getFromCache(cacheKey);\n\t\t\tif (result !== undefined) {\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\tconst monitor = new MonitorMongo('aggregate', collectionName, JSON.stringify([pipeline, options]));\n\t\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\t\t\tresult = await collection.aggregate(pipeline, options).toArray();\n\t\t\tmonitor.finish();\n\n\t\t\tthis.addToCache(collectionName, cacheKey, result);\n\n\t\t\treturn result;\n\t\t}\n\t\tcatch (error) {\n\t\t\tconsole.error(new Date(), 'Error in aggregate', collectionName, error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t// Implement other methods like findOne, insertOne, updateOne, etc., similarly\n\n\tprivate generateCacheKey(collectionName: string, functionName: string, args: any[]): string {\n\t\tconst keyString = JSON.stringify({ collectionName, functionName, args });\n\t\treturn crypto.createHash('sha256').update(keyString).digest('hex');\n\t}\n\n\tprivate getFromCache(cacheKey: string): any | undefined {\n\t\ttry {\n\t\t\tconst cachedData = this._nodeCache.get(cacheKey);\n\t\t\tif (cachedData) {\n\t\t\t\treturn JSON.parse(cachedData, dateReviver);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\t// If cache is corrupted or JSON parse fails, remove it\n\t\t\tthis._nodeCache.del(cacheKey);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate addToCache(collectionName: string, cacheKey: string, data: any) {\n\t\tif (getBinarySize(JSON.stringify(data)) < 1000000) {\n\t\t\tlet nodeCacheSize = this._nodeCache.getStats().vsize;\n\n\t\t\tif (nodeCacheSize > this._heapLimit) {\n\t\t\t\tlet deleteCount = 0;\n\t\t\t\tconst keys = this._nodeCache.keys();\n\n\t\t\t\tfor (const key of keys) {\n\t\t\t\t\tthis._nodeCache.del(key);\n\t\t\t\t\tthis._debugRemoveCacheHits += 1;\n\t\t\t\t\tdeleteCount += 1;\n\n\t\t\t\t\tnodeCacheSize = this._nodeCache.getStats().vsize;\n\n\t\t\t\t\tif (nodeCacheSize < this._heapLimit * 0.75) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconsole.log('Query Cache: ' + 'Too Big, - Deleted: ' + deleteCount + ' - ' + nodeCacheSize);\n\t\t\t}\n\n\t\t\tthis._nodeCache.set(cacheKey, JSON.stringify(data));\n\n\t\t\tthis._cacheMap.push({collection: collectionName, key: cacheKey});\n\t\t}\n\t}\n\n\tpublic invalidateQueryCache(collection: string) {\n\t\tlet collectionCacheMap = this._cacheMap.filter(a => a.collection === collection);\n\n\t\tfor (const cacheMap of collectionCacheMap) {\n\t\t\tthis._nodeCache.del(cacheMap.key);\n\t\t}\n\n\t\tthis._cacheMap = this._cacheMap.filter(a => a.collection !== collection);\n\t}\n\n\tprivate setupChangeStream() {\n\t\tconst db = ResolveIOServer.getMongoConnection().db(this._serverConfig['DATABASE']);\n\t\tconst changeStream = db.watch();\n\n\t\tchangeStream.on('change', async change => {\n\t\t\t// Call the invalidateQueryCache based on the collection affected\n\t\t\tif (change['ns'] && change['ns'].coll) {\n\t\t\t\tconst collectionName = change['ns'].coll;\n\n\t\t\t\tif (this.collection(collectionName)) {\n\t\t\t\t\tthis.invalidateQueryCache(collectionName);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tchangeStream.on('error', err => {\n\t\t\tconsole.log(new Date(), 'Mongo change stream error. Restart...');\n\t\t\tchangeStream.close();\n\t\t\tsetTimeout(() => this.setupChangeStream(), 5000); // Restart after a delay\n\t\t});\n\n\t\tchangeStream.on('close', () => {\n\t\t\tconsole.log(new Date(), 'Mongo change stream closed. Restarting...');\n\t\t\tsetTimeout(() => this.setupChangeStream(), 5000); // Restart after a delay\n\t\t});\n\t}\n}\n\nexport class MongoManagerModel<T extends CollectionDocument> {\n\tcollection_main: MongoManagerCollection<T> | MongoManagerUserCollection<T> = null;\n\tcollection_version: MongoManagerCollection<T> | MongoManagerUserCollection<T> = null;\n\n\tconstructor(options: MongoManagerCollectionOptions) {\n\t\tif (options.collectionName === 'users') {\n\t\t\tthis.collection_main = new MongoManagerUserCollection<T>(options);\n\t\t}\n\t\telse {\n\t\t\tthis.collection_main = new MongoManagerCollection<T>(options);\n\t\t}\n\n\t\tif (options.useVersionCollection) {\n\t\t\tthis.collection_main.useVersions = true;\n\t\t\t\n\t\t\tlet versionSchema = deepCopy(options.schema);\n\t\t\tversionSchema._id.type = 'Object';\n\t\t\tversionSchema._id.blackbox = true;\n\n\t\t\tlet versionOptions: MongoManagerCollectionOptions = {\n\t\t\t\tcollectionName: options.collectionName + '.versions',\n\t\t\t\tschema: versionSchema,\n\t\t\t\tuseVersionCollection: false,\n\t\t\t\tuseReportBuilder: false,\n\t\t\t\treportBuilderLookupTables: [],\n\t\t\t\ttimestamps: true,\n\t\t\t\tcreateLogs: false,\n\t\t\t\tcheckSchema: false,\n\t\t\t\tcollectionOptions: null\n\t\t\t};\n\n\t\t\tif (options.collectionName === 'users') {\t\n\t\t\t\tthis.collection_version = new MongoManagerUserCollection<T>(versionOptions);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.collection_version = new MongoManagerCollection<T>(versionOptions);\n\t\t\t}\n\n\t\t\tthis.collection_version.createIndex({'_id._id': 1, '_id.__v': 1});\n\t\t\tthis.collection_main.versionCollection = options.collectionName + '.versions';\n\t\t}\n\t}\n}\n\nexport interface MongoManagerCollectionOptions {\n\tcollectionName: string;\n\tschema: object;\n\tuseVersionCollection: boolean;\n\tuseReportBuilder: boolean;\n\treportBuilderLookupTables: LookupTables[]\n\ttimestamps: boolean;\n\tcreateLogs: boolean;\n\tcheckSchema: boolean;\n\tcollectionOptions: CreateCollectionOptions;\n}\n\nexport class MongoManagerCollection<T extends CollectionDocument> {\n\tcollectionName = '';\n\tcheckSchema = false;\n\tsimplschema = null;\n\trbSchema = null;\n\ttimestamps = false;\n\tuseVersions = false;\n\tversionCollection = '';\n\tcreateLogs = true;\n\tuseRB = false;\n\tcollectionOptions: CreateCollectionOptions;\n\t\n\tconstructor(options: MongoManagerCollectionOptions) {\n\t\tthis.collectionName = options.collectionName;\n\t\tthis.simplschema = new SimpleSchema(options.schema);\n\t\tthis.timestamps = options.timestamps;\n\t\tthis.createLogs = options.createLogs;\n\t\tthis.checkSchema = options.checkSchema;\n\t\tthis.collectionOptions = options.collectionOptions;\n\n\t\tif (options.useReportBuilder) {\n\t\t\tthis.useRB = true;\n\t\t\tlet schemaCopy = deepCopy(options.schema);\n\t\t\tlet rbSchema = buildRbLookups(options.reportBuilderLookupTables, schemaCopy, []);\n\t\t\tthis.rbSchema = buildRbSchema(rbSchema);\n\t\t}\n\n\t\tlet interval = setInterval(() => {\n\t\t\tif (ResolveIOServer && ResolveIOServer.getMainServer() && ResolveIOServer.getMongoManager() && ResolveIOServer.getMongoManager().getServerCollections().length) {\n\t\t\t\tResolveIOServer.getMongoManager().registerCollection(this);\n\t\t\t\tclearInterval(interval);\n\t\t\t}\n\t\t}, 1);\n\t}\n\n\tprivate static indexQueue = async.queue(async (task, callback) => {\n const { action, collection, specs, options } = task;\n \n const dbCollection = ResolveIOServer.getMainDB().collection(collection.collectionName, collection.collectionOptions);\n \n if (!dbCollection) {\n return callback(new Error(`Collection ${collection.collectionName} not found`));\n }\n\n let monitor = new MonitorMongo(action, collection.collectionName, JSON.stringify([specs, options]));\n\n const createIndex = async () => {\n try {\n const result = await dbCollection[action](...specs, options);\n monitor.finish();\n callback(null, result);\n } catch (err) {\n if (err.code === 85 || err.message.includes('IndexOptionsConflict')) {\n try {\n const existingIndexName = collection.extractIndexNameFromError(err.message);\n if (existingIndexName) {\n await dbCollection.dropIndex(existingIndexName);\n return await createIndex();\n }\n } catch (innerError) {\n callback(innerError);\n }\n }\n monitor.finish();\n callback(err);\n }\n };\n\n await createIndex();\n }, 1);\n\n // Method to extract index name from error message\n extractIndexNameFromError(errorMessage) {\n\t\tlet regexPattern = /Index already exists with a different name: (\\S+)/;\n\t\tlet matches = errorMessage.match(regexPattern);\n\t\n\t\tif (!matches || matches.length <= 1) {\n\t\t\t// If the first pattern doesn't match, try the second pattern\n\t\t\tregexPattern = /existing index:.*name: \"([^\"]+)\"/;\n\t\t\tmatches = errorMessage.match(regexPattern);\n\t\t}\n\t\n\t\treturn matches && matches.length > 1 ? matches[1] : null;\n\t}\t\n\n\taggregate(pipeline: object[], options?: AggregateOptions, skipCache = false) : Promise<any[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tif (!skipCache) {\n\t\t\t\tResolveIOServer.getMongoManager().aggregate(this.collectionName, pipeline, options).then(res => {\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet monitor = new MonitorMongo('aggregate', this.collectionName, JSON.stringify([pipeline, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options).toArray().then(res => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Aggregate', this.collectionName, pipeline, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tasync aggregateCount(pipeline: object[], options?: AggregateOptions) : Promise<number> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('aggregateCount', this.collectionName, JSON.stringify([pipeline, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options).toArray().then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res.length);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Aggregate', this.collectionName, pipeline, options, err);\n\t\t\t\treject(0);\n\t\t\t});\n\t\t});\n\t}\n\n\taggregateCursor(pipeline: object[], options?: AggregateOptions): AggregationCursor {\n\t\tlet monitor = new MonitorMongo('aggregateCursor', this.collectionName, JSON.stringify([pipeline, options]));\n\t\tlet cursor = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options);\n\t\tcursor.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn cursor;\n\t}\n\n\taggregateStream(pipeline: object[], options?: AggregateOptions, streamOptions?: CursorStreamOptions) {\n\t\tlet monitor = new MonitorMongo('aggregateStream', this.collectionName, JSON.stringify([pipeline, options, streamOptions]));\n\t\tlet stream = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options).stream(streamOptions);\n\t\tstream.on('end', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('error', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn stream;\n\t}\n\n\t// bulkWrite(operations: AnyBulkWriteOperation<T>[], options: BulkWriteOptions): Promise<BulkWriteResult> {\n\tbulkWrite(operations: any[], options?: BulkWriteOptions, bypassLogs = false, bypassCheckSchema = false): Promise<BulkWriteResult> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!operations.length) {\n\t\t\t\tresolve(null);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst logs = [];\n\t\t\tconst versionOps = []; // For storing versioning ops\n\t\t\tconst deleteOldVersionsOps = []; // For deleteMany operations to remove older versions\n\t\t\tconst bulkOps = [];\n\t\t\tconst updateFilters = [];\n\t\t\tconst updateManyFilters = [];\n\t\t\tconst deleteManyFilters = [];\n\t\n\t\t\t// Collect filters for all operations\n\t\t\toperations.forEach(op => {\n\t\t\t\tconst opType = Object.keys(op)[0];\n\t\t\t\tif (opType === 'updateOne' || opType === 'deleteOne' || opType === 'replaceOne') {\n\t\t\t\t\tupdateFilters.push(op[opType].filter); // Store filters for updateOne, deleteOne, and replaceOne\n\t\t\t\t}\n\t\t\t\telse if (opType === 'updateMany') {\n\t\t\t\t\tupdateManyFilters.push(op[opType].filter); // Store the entire filter for updateMany\n\t\t\t\t}\n\t\t\t\telse if (opType === 'deleteMany') {\n\t\t\t\t\tdeleteManyFilters.push(op[opType].filter); // Store the entire filter for deleteMany\n\t\t\t\t}\n\t\t\t});\n\t\n\t\t\t// Pre-fetch all documents based on the filters before proceeding with the bulk operations\n\t\t\tconst currentDocs = updateFilters.length || updateManyFilters.length || deleteManyFilters.length\n\t\t\t\t? await this.find(<any>{ $or: [...updateFilters, ...updateManyFilters, ...deleteManyFilters] })\n\t\t\t\t: [];\n\n\t\t\t// Helper function to get the value from a document using a dot-notated key (e.g., 'obj.property')\n\t\t\t// This will also handle arrays of objects (e.g., 'obj.arrayOfObjects.property')\n\t\t\tconst getNestedValue = (doc, key) => {\n\t\t\t\tconst parts = key.split('.');\n\n\t\t\t\treturn parts.reduce((acc, part) => {\n\t\t\t\t\tif (Array.isArray(acc)) {\n\t\t\t\t\t\t// If we're dealing with an array, return an array of values for each element\n\t\t\t\t\t\treturn acc.map(item => item[part]).filter(val => val !== undefined);\n\t\t\t\t\t}\n\t\t\t\t\treturn acc && acc[part];\n\t\t\t\t}, doc);\n\t\t\t};\n\t\n\t\t\t// Helper function to locally find matching documents based on filter\n\t\t\tconst findMatchingDocs = (filter) => {\n\t\t\t\treturn currentDocs.filter(doc => {\n\t\t\t\t\treturn matchDocument(filter, doc);\n\t\t\t\t});\n\t\t\t};\n\n\t\t\tconst matchDocument = (filter, doc) => {\n\t\t\t\treturn Object.keys(filter).every(key => {\n\t\t\t\t\tconst value = filter[key];\n\t\t\t\t\tconst docValue = getNestedValue(doc, key); // Get nested value from the document\n\t\t\t\n\t\t\t\t\t// Handle logical operators\n\t\t\t\t\tif (key === '$and') {\n\t\t\t\t\t\treturn value.every(subFilter => matchDocument(subFilter, doc));\n\t\t\t\t\t}\n\t\t\t\n\t\t\t\t\tif (key === '$or') {\n\t\t\t\t\t\treturn value.some(subFilter => matchDocument(subFilter, doc));\n\t\t\t\t\t}\n\t\t\t\n\t\t\t\t\t// If docValue is an array, apply filter conditions to each element\n\t\t\t\t\tif (Array.isArray(docValue)) {\n\t\t\t\t\t\treturn docValue.some(val => evaluateCondition(value, val));\n\t\t\t\t\t}\n\t\t\t\n\t\t\t\t\t// Otherwise, apply the condition to the single value\n\t\t\t\t\treturn evaluateCondition(value, docValue);\n\t\t\t\t});\n\t\t\t};\n\t\t\t\n\t\t\t// Helper function to evaluate the condition (value) against the document value (docValue)\n\t\t\tconst evaluateCondition = (condition, docValue) => {\n\t\t\t\t// If condition is an object, handle operators like $in, $nin, $ne, etc.\n\t\t\t\tif (condition instanceof Object) {\n\t\t\t\t\tif ('$in' in condition) {\n\t\t\t\t\t\treturn condition.$in.includes(docValue);\n\t\t\t\t\t}\n\t\t\t\t\tif ('$nin' in condition) {\n\t\t\t\t\t\treturn !condition.$nin.includes(docValue);\n\t\t\t\t\t}\n\t\t\t\t\tif ('$ne' in condition) {\n\t\t\t\t\t\treturn docValue !== condition.$ne;\n\t\t\t\t\t}\n\t\t\t\t\tif ('$gt' in condition) {\n\t\t\t\t\t\treturn docValue > condition.$gt;\n\t\t\t\t\t}\n\t\t\t\t\tif ('$gte' in condition) {\n\t\t\t\t\t\treturn docValue >= condition.$gte;\n\t\t\t\t\t}\n\t\t\t\t\tif ('$lt' in condition) {\n\t\t\t\t\t\treturn docValue < condition.$lt;\n\t\t\t\t\t}\n\t\t\t\t\tif ('$lte' in condition) {\n\t\t\t\t\t\treturn docValue <= condition.$lte;\n\t\t\t\t\t}\n\t\t\t\t\tif ('$exists' in condition) {\n\t\t\t\t\t\treturn (docValue !== undefined) === condition.$exists;\n\t\t\t\t\t}\n\t\t\t\t\tif ('$regex' in condition) {\n\t\t\t\t\t\tconst regex = new RegExp(condition.$regex, condition.$options || '');\n\t\t\t\t\t\treturn regex.test(docValue);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\n\t\t\t\t// Handle regular equality comparison\n\t\t\t\treturn docValue === condition;\n\t\t\t};\n\t\n\t\t\tfor (const op of operations) {\n\t\t\t\tconst opType = Object.keys(op)[0];\n\t\t\t\tlet doc = op[opType];\n\t\n\t\t\t\tif (opType === 'insertOne') {\n\t\t\t\t\t// Ensure _id and __v for insertOne operations\n\t\t\t\t\tif (!doc.document._id) {\n\t\t\t\t\t\tdoc.document._id = objectIdHexString();\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (this.useVersions && !doc.document.hasOwnProperty('__v')) {\n\t\t\t\t\t\tdoc.document.__v = 0;\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tlet date = new Date();\n\n\t\t\t\t\t\tif (!doc.document.createdAt) {\n\t\t\t\t\t\t\tdoc.document.createdAt = date;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!doc.document.updatedAt) {\n\t\t\t\t\t\t\tdoc.document.updatedAt = date;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\t\tconst isValid = validation.validate(doc.document);\n\t\t\n\t\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - bulkWrite - insertOne', validation.validationErrors());\n\t\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on bulkWrite insertOne - ' + this.collectionName, [validation.validationErrors(), doc.document]);\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t// Log the operation\n\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\tid_document: doc.document._id,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options])) < 200000 ? JSON.stringify([op, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\n\t\t\t\t\tbulkOps.push(op); // Add insertOne operation to bulkOps\n\t\t\t\t} \n\t\t\t\telse if (opType === 'updateOne') {\t\n\t\t\t\t\t// Find all matching documents locally based on filter\n\t\t\t\t\tconst matchingDocs = findMatchingDocs(doc.filter);\n\t\n\t\t\t\t\tif (matchingDocs.length) {\n\t\t\t\t\t\tfor (let currentDoc of matchingDocs) {\n\t\t\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\t\t\tif (doc.update.$set) {\n\t\t\t\t\t\t\t\t\tdoc.update.$set.updatedAt = new Date();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\tdoc.update.$set = { updatedAt: new Date() };\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\t\t\t\tconst isValid = validation.validate(doc.update, {modifier: true});\n\t\t\t\t\n\t\t\t\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - bulkWrite - updateOne', validation.validationErrors());\n\t\t\t\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on bulkWrite updateOne - ' + this.collectionName, [validation.validationErrors(), doc.update, currentDoc]);\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\t\tlet versionDoc = deepCopy(currentDoc);\n\n\t\t\t\t\t\t\t\tversionDoc._id = <any>{_id: versionDoc._id, __v: versionDoc.__v};\n\n\t\t\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\t\tdocument: versionDoc\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\n\t\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.update, '__v')) {\n\t\t\t\t\t\t\t\t\tif (!doc.update.$inc) {\n\t\t\t\t\t\t\t\t\t\tdoc.update.$inc = { __v: 1 };\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\tdoc.update.$inc.__v = 1;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\t\t// Delete old versions if __v >= 4\n\t\t\t\t\t\t\t\tif (versionDoc.__v >= 4) {\n\t\t\t\t\t\t\t\t\tdeleteOldVersionsOps.push({\n\t\t\t\t\t\t\t\t\t\tdeleteMany: {\n\t\t\t\t\t\t\t\t\t\t\tfilter: {\n\t\t\t\t\t\t\t\t\t\t\t\t'_id._id': versionDoc._id._id,\n\t\t\t\t\t\t\t\t\t\t\t\t'_id.__v': { $lt: versionDoc.__v - 4 }\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\t\tid_document: currentDoc._id,\n\t\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options, currentDoc])) < 200000 ? JSON.stringify([op, options, currentDoc], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\tbulkOps.push(op); // Add updateOne or replaceOne operation to bulkOps\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (doc.upsert) {\n\t\t\t\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\t\t\t\tconst isValid = validation.validate(doc.update, {modifier: true});\n\t\t\t\t\n\t\t\t\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - bulkWrite - updateOne', validation.validationErrors());\n\t\t\t\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on bulkWrite updateOne - ' + this.collectionName, [validation.validationErrors(), doc.update]);\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.update, '_id')) {\n\t\t\t\t\t\t\t\tdoc.update.$setOnInsert._id = objectIdHexString();\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.update, '__v')) {\n\t\t\t\t\t\t\t\t\tdoc.update.$setOnInsert.__v = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n \n\t\t\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.update, 'createdAt')) {\n\t\t\t\t\t\t\t\t\tdoc.update.$setOnInsert.createdAt = new Date();\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.update, 'updatedAt')) {\n\t\t\t\t\t\t\t\t\tdoc.update.$setOnInsert.updatedAt = new Date();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\t\tid_document: doc.update.$setOnInsert._id,\n\t\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options, doc.update])) < 200000 ? JSON.stringify([op, options, doc.update], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\tbulkOps.push(op); // Add updateOne or replaceOne operation to bulkOps\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (opType === 'replaceOne') {\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tdoc.replacement.updatedAt = new Date();\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Find all matching documents locally based on filter\n\t\t\t\t\tconst matchingDocs = findMatchingDocs(doc.filter);\n\t\n\t\t\t\t\tif (matchingDocs.length) {\n\t\t\t\t\t\tfor (let currentDoc of matchingDocs) {\n\t\t\t\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\t\t\t\tconst isValid = validation.validate(doc.replacement);\n\t\t\t\t\n\t\t\t\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - bulkWrite - insertOne', validation.validationErrors());\n\t\t\t\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on bulkWrite replaceOne - ' + this.collectionName, [validation.validationErrors(), doc.replacement]);\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\t\tlet versionDoc = deepCopy(currentDoc);\n\n\t\t\t\t\t\t\t\tversionDoc._id = <any>{_id: versionDoc._id, __v: versionDoc.__v};\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\t\tdocument: versionDoc\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\n\t\t\t\t\t\t\t\tdoc.replacement.__v = versionDoc.__v + 1;\n\t\t\n\t\t\t\t\t\t\t\t// Delete old versions if __v >= 4\n\t\t\t\t\t\t\t\tif (versionDoc.__v >= 4) {\n\t\t\t\t\t\t\t\t\tdeleteOldVersionsOps.push({\n\t\t\t\t\t\t\t\t\t\tdeleteMany: {\n\t\t\t\t\t\t\t\t\t\t\tfilter: {\n\t\t\t\t\t\t\t\t\t\t\t\t'_id._id': versionDoc._id._id,\n\t\t\t\t\t\t\t\t\t\t\t\t'_id.__v': { $lt: versionDoc.__v - 4 }\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\t\tid_document: currentDoc._id,\n\t\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options, currentDoc])) < 200000 ? JSON.stringify([op, options, currentDoc], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\tbulkOps.push(op); // Add updateOne or replaceOne operation to bulkOps\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (doc.upsert) {\n\t\t\t\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\t\t\t\tconst isValid = validation.validate(doc.replacement);\n\t\t\t\t\n\t\t\t\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - bulkWrite - replaceOne', validation.validationErrors());\n\t\t\t\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on bulkWrite replaceOne - ' + this.collectionName, [validation.validationErrors(), doc.replacement]);\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.replacement, '_id')) {\n\t\t\t\t\t\t\t\tdoc.replacement._id = objectIdHexString();\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.replacement, '__v')) {\n\t\t\t\t\t\t\t\t\tdoc.replacement.__v = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n \n\t\t\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.replacement, 'createdAt')) {\n\t\t\t\t\t\t\t\t\tdoc.replacement.createdAt = new Date();\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.replacement, 'updatedAt')) {\n\t\t\t\t\t\t\t\t\tdoc.replacement.updatedAt = new Date();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\t\tid_document: doc.replacement._id,\n\t\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options, doc.replacement])) < 200000 ? JSON.stringify([op, options, doc.replacement], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\tbulkOps.push(op); // Add updateOne or replaceOne operation to bulkOps\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (opType === 'deleteOne') {\n\t\t\t\t\t// Find all matching documents locally based on filter\n\t\t\t\t\tconst matchingDocs = findMatchingDocs(doc.filter);\n\t\t\t\t\t\n\t\t\t\t\tmatchingDocs.forEach(currentDoc => {\n\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\tlet versionDoc = deepCopy(currentDoc);\n\n\t\t\t\t\t\t\tversionDoc._id = <any>{_id: versionDoc._id, __v: versionDoc.__v};\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: versionDoc\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\n\t\t\t\t\t\t\t// Delete old versions if __v >= 4\n\t\t\t\t\t\t\tif (versionDoc.__v >= 4) {\n\t\t\t\t\t\t\t\tdeleteOldVersionsOps.push({\n\t\t\t\t\t\t\t\t\tdeleteMany: {\n\t\t\t\t\t\t\t\t\t\tfilter: {\n\t\t\t\t\t\t\t\t\t\t\t'_id._id': versionDoc._id._id,\n\t\t\t\t\t\t\t\t\t\t\t'_id.__v': { $lt: versionDoc.__v - 4 }\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\tid_document: currentDoc._id,\n\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options, currentDoc])) < 200000 ? JSON.stringify([op, options, currentDoc], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tbulkOps.push(op); // Add deleteOne operation to bulkOps\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (opType === 'updateMany') {\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tif (doc.update.$set) {\n\t\t\t\t\t\t\tdoc.update.$set.updatedAt = new Date();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdoc.update.$set = {\n\t\t\t\t\t\t\t\tupdatedAt: new Date()\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.update, '__v')) {\n\t\t\t\t\t\t\tif (!doc.update.$inc) {\n\t\t\t\t\t\t\t\tdoc.update.$inc = { __v: 1 };\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tdoc.update.$inc.__v = 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Process all documents matching the updateMany filter locally\n\t\t\t\t\tconst matchingDocs = findMatchingDocs(doc.filter);\n\t\n\t\t\t\t\tfor (let currentDoc of matchingDocs) {\n\t\t\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\t\t\tconst isValid = validation.validate(doc.update, {modifier: true});\n\t\t\t\n\t\t\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - bulkWrite - insertOne', validation.validationErrors());\n\t\t\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on bulkWrite updateMany - ' + this.collectionName, [validation.validationErrors(), doc.update]);\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\tlet versionDoc = deepCopy(currentDoc);\n\n\t\t\t\t\t\t\tversionDoc._id = <any>{_id: versionDoc._id, __v: versionDoc.__v};\n\n\t\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: versionDoc\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\n\t\t\t\t\t\t\t// Delete old versions if __v >= 4\n\t\t\t\t\t\t\tif (versionDoc.__v >= 4) {\n\t\t\t\t\t\t\t\tdeleteOldVersionsOps.push({\n\t\t\t\t\t\t\t\t\tdeleteMany: {\n\t\t\t\t\t\t\t\t\t\tfilter: {\n\t\t\t\t\t\t\t\t\t\t\t'_id._id': versionDoc._id._id,\n\t\t\t\t\t\t\t\t\t\t\t'_id.__v': { $lt: versionDoc.__v - 4 }\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\tid_document: currentDoc._id,\n\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options])) < 200000 ? JSON.stringify([op, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tbulkOps.push(op); // Add updateMany operation to bulkOps\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (opType === 'deleteMany') {\n\t\t\t\t\t// Process all documents matching the deleteMany filter locally\n\t\t\t\t\tconst matchingDocs = findMatchingDocs(doc.filter);\n\t\n\t\t\t\t\tmatchingDocs.forEach(currentDoc => {\n\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\tlet versionDoc = deepCopy(currentDoc);\n\n\t\t\t\t\t\t\tversionDoc._id = <any>{_id: versionDoc._id, __v: versionDoc.__v};\n\n\t\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: versionDoc\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\n\t\t\t\t\t\t\t// Delete old versions if __v >= 4\n\t\t\t\t\t\t\tif (versionDoc.__v >= 4) {\n\t\t\t\t\t\t\t\tdeleteOldVersionsOps.push({\n\t\t\t\t\t\t\t\t\tdeleteMany: {\n\t\t\t\t\t\t\t\t\t\tfilter: {\n\t\t\t\t\t\t\t\t\t\t\t'_id._id': versionDoc._id._id,\n\t\t\t\t\t\t\t\t\t\t\t'_id.__v': { $lt: versionDoc.__v - 4 }\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\tid_document: currentDoc._id,\n\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options])) < 200000 ? JSON.stringify([op, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tbulkOps.push(op); // Add deleteMany operation to bulkOps\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\ttry {\n\t\t\t\tif (bulkOps.length) {\n\t\t\t\t\tlet monitor = new MonitorMongo('bulkWrite', this.collectionName, JSON.stringify([bulkOps.slice(-100), options]));\n\t\t\t\t\t\n\t\t\t\t\t// First, perform the main bulk operations on the collection\n\t\t\t\t\tconst mainResult = await ResolveIOServer.getMainDB().collection<T>(this.collectionName).bulkWrite(bulkOps, options);\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\n\t\t\t\t\t// Separate bulkWrite for versions (if any versioning is required)\n\t\t\t\t\tif (versionOps.length || deleteOldVersionsOps.length) {\n\t\t\t\t\t\tawait ResolveIOServer.getMainDB().collection<T>(this.versionCollection).bulkWrite([...versionOps, ...deleteOldVersionsOps]);\n\t\t\t\t\t}\n\t\t\n\t\t\t\t\t// Separate bulkWrite for logs (if logging is enabled)\n\t\t\t\t\tif (!bypassLogs && logs.length) {\n\t\t\t\t\t\tawait Logs.bulkWrite(logs);\n\t\t\t\t\t}\n\t\t\n\t\t\t\t\tmonitor.finish();\n\t\n\t\t\t\t\tresolve(mainResult); // Resolve with the result of the main bulkWrite\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tresolve(null);\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tconsole.log(new Date(), 'Error Bulk Write', this.collectionName, bulkOps.slice(-100), options, err);\n\t\t\t\treject(err);\n\t\t\t}\n\t\t});\n\t}\n\n\tcountDocuments(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: CountDocumentsOptions): Promise<number> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('countDocuments', this.collectionName, JSON.stringify([filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).countDocuments(<any>filter, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Count Documents', this.collectionName, filter, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\t//Helper Function (1 or Many) - Not Real Mongo Function\n\tcreate(f_docs: T | T[], options?: InsertOneOptions | BulkWriteOptions): Promise<T | T[]> {\n\t\tif (!Array.isArray(f_docs)) {\n\t\t\treturn this.insertOne(f_docs, <InsertOneOptions>options);\n\t\t}\n\t\telse if (f_docs.length === 1) {\n\t\t\treturn this.insertOne(f_docs[0], <InsertOneOptions>options);\n\t\t}\n\n\t\treturn this.insertMany(f_docs, <BulkWriteOptions>options);\n\t}\n\n\tcreateIndex(fieldOrSpec: any, options?: CreateIndexesOptions): Promise<string> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tMongoManagerCollection.indexQueue.push({\n\t\t\t\taction: 'createIndex',\n\t\t\t\tcollection: this, // Current instance\n\t\t\t\tspecs: [fieldOrSpec],\n\t\t\t\toptions: options\n\t\t\t}, (err, result) => {\n\t\t\t\tif (err) reject(err);\n\t\t\t\telse resolve(result);\n\t\t\t});\n\t\t});\n\t}\n\t\n\tcreateIndexes(indexSpecs: IndexDescription[], options?: CreateIndexesOptions): Promise<string[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tMongoManagerCollection.indexQueue.push({\n\t\t\t\taction: 'createIndexes',\n\t\t\t\tcollection: this, // Current instance\n\t\t\t\tspecs: [indexSpecs],\n\t\t\t\toptions: options\n\t\t\t}, (err, result) => {\n\t\t\t\tif (err) reject(err);\n\t\t\t\telse resolve(result);\n\t\t\t});\n\t\t});\n\t}\n\n\tdeleteMany(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: DeleteOptions, bypassLogs = false): Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\tlet docs = await this.find(filter);\n\n\t\t\t\tfor (let i = 0; i < docs.length; i++) {\n\t\t\t\t\tlet doc = docs[i];\n\t\t\t\t\n\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, options])) < 200000 ? JSON.stringify([doc, filter, options], null, 2) : 'Too Big',\n\t\t\t\t\t\tmethod: 'deleteMany',\n\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\troute: ''\n\t\t\t\t\t});\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 1}}]});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('deleteMany', this.collectionName, JSON.stringify([filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).deleteMany(<any>filter, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\tresolve(res.deletedCount);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Delete Many', this.collectionName, filter, options, err);\n\t\t\t\treject(err)\n\t\t\t});\n\t\t});\n\t}\n\n\tdeleteOne(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOneAndDeleteOptions, bypassLogs = false): Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\tlet monitor = new MonitorMongo('findOneAndDelete', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndDelete(<any>filter, options).then(async returnVal => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tlet doc = returnVal;\n\n\t\t\t\t\tif (doc) {\n\t\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, options])) < 200000 ? JSON.stringify([doc, filter, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'deleteOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\t\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 1}}]});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\n\t\t\t\t\t\tresolve(1);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tresolve(0);\n\t\t\t\t\t}\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Find One And Delete', this.collectionName, filter, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet monitor = new MonitorMongo('deleteOne', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).deleteOne(<any>filter, options).then(res => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\tresolve(res.deletedCount);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t}\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Delete One', this.collectionName, filter, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\t\t\t\n\t\t});\n\t}\n\n\tdistinct(key: string, filter?: MongoManagerFilter<T> & MongoManagerFilterOperators<T>, options?: CommandOperationOptions): Promise<T[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('distinct', this.collectionName, JSON.stringify([key, filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).distinct(key, <any>filter, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Distinct', this.collectionName, filter, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tdrop(options?: CommandOperationOptions): Promise<boolean> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('drop', this.collectionName, JSON.stringify([options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).drop(options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Count Documents', this.collectionName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tdropIndex(indexName: string, options?: CommandOperationOptions): Promise<Document> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('dropIndex', this.collectionName, JSON.stringify([indexName, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).dropIndex(indexName, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(<Document>res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Drop Index', this.collectionName, indexName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tdropIndexes(options?: CommandOperationOptions): Promise<Boolean> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('dropIndexes', this.collectionName, JSON.stringify([options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).dropIndexes(options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Drop Indexes', this.collectionName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tfind(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>, skipCache = false): Promise<T[]> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!skipCache) {\n\t\t\t\tResolveIOServer.getMongoManager().find(this.collectionName, filter, options).then(res => {\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet monitor = new MonitorMongo('find', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).find<T>(<any>filter, options).toArray().then(res => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Find', this.collectionName, filter, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tfindById(id: string, options?: FindOptions<T>): Promise<T> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('findById', this.collectionName, JSON.stringify([{_id: id}, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOne<T>(<any>{_id: id}, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find By Id', this.collectionName, {_id: id}, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tfindCount(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>): Promise<Number> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('findCount', this.collectionName, JSON.stringify([filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).find(<any>filter, options).count().then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find Count', this.collectionName, filter, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tfindCursor(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>): FindCursor {\n\t\tlet monitor = new MonitorMongo('findCursor', this.collectionName, JSON.stringify([filter, options]));\n\t\tlet cursor = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).find(<any>filter, options);\n\t\tcursor.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\tcursor.removeAllListeners();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn cursor;\n\t}\n\n\tfindStream(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>, streamOptions?: CursorStreamOptions) {\n\t\tlet monitor = new MonitorMongo('findStream', this.collectionName, JSON.stringify([filter, options, streamOptions]));\n\t\tlet stream = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).find(<any>filter, options).stream(streamOptions);\n\t\tstream.on('end', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('error', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn stream;\n\t}\n\n\tfindOne(filter: MongoManagerFilter<T> | MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>, skipCache = false): Promise<T> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tif (!skipCache) {\n\t\t\t\tResolveIOServer.getMongoManager().findOne(this.collectionName, filter, options).then(res => {\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet monitor = new MonitorMongo('findOne', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOne<T>(<any>filter, options).then(res => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Find One', this.collectionName, filter, options, err);\n\t\t\t\t\treject(err)\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tfindOneAndDelete(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOneAndDeleteOptions, bypassLogs = false): Promise<T> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('findOneAndDelete', this.collectionName, JSON.stringify([filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndDelete(<any>filter, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tlet doc = res;\n\t\t\t\t\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, options])) < 200000 ? JSON.stringify([doc, filter, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'findOneAndDelete',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t}\n\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\n\t\t\t\t\tresolve(<T>doc);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tresolve(null);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find One And Delete', this.collectionName, filter, options, err);\n\t\t\t\treject(err)\n\t\t\t});\n\t\t});\n\t}\n\n\tfindOneAndReplace(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, replacement: T, options?: FindOneAndReplaceOptions, bypassLogs = false, bypassCheckSchema = false): Promise<T> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(replacement);\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - findOneAndReplace', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on findOneAndReplace - ' + this.collectionName, [validation.validationErrors(), replacement]);\n\t\t\t\t\t\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tlet date = new Date();\n\n\t\t\tif (this.timestamps) {\n\t\t\t\treplacement.updatedAt = date;\n\t\t\t}\n\n\t\t\tif (options && options.upsert) {\n\t\t\t\tif (!replacement._id) {\n\t\t\t\t\treplacement._id = objectIdHexString();\n\t\t\t\t}\n\n\t\t\t\tif (this.useVersions) {\n\t\t\t\t\treplacement.__v = 0;\n\t\t\t\t}\n\n\t\t\t\tif (this.timestamps && !replacement.createdAt) {\n\t\t\t\t\treplacement.createdAt = date;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('findOneAndReplace', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndReplace(<any>filter, replacement, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tlet doc = res;\n\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, replacement, options])) < 200000 ? JSON.stringify([doc, filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'findOneAndReplace',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t}\n\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\n\t\t\t\t\tresolve(<T>doc);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tresolve(null);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find One And Replace', this.collectionName, filter, options, err);\n\t\t\t\treject(err)\n\t\t\t});\n\t\t});\n\t}\n\n\tfindOneAndUpdate(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, update: MongoManagerUpdateFilter<T>, options?: FindOneAndUpdateOptions, bypassLogs = false, bypassCheckSchema = false): Promise<T> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(update, {modifier: true});\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - findOneAndUpdate', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on findOneAndUpdate - ' + this.collectionName, [validation.validationErrors(), update]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.timestamps) {\n\t\t\t\tlet date = new Date(); \n\t\t\t\t\n\t\t\t\tif (!update.$set) {\n\t\t\t\t\tupdate.$set = <any>{updatedAt: date};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tupdate.$set.updatedAt = date;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (options && options.upsert) {\n\t\t\t\tif (!update.$setOnInsert) {\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t_id: objectIdHexString()\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (!update.$setOnInsert._id) {\n\t\t\t\t\t\tupdate.$setOnInsert._id = objectIdHexString();\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.timestamps && !update.$setOnInsert.createdAt) {\n\t\t\t\t\t\tupdate.$setOnInsert.createdAt = new Date();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('findOneAndUpdate', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndUpdate(<any>filter, <any>update, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tlet doc = res;\n\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\t\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, options])) < 200000 ? JSON.stringify([doc, filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'findOneAndUpdate',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t}\n\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\n\t\t\t\t\tresolve(<T>doc);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tresolve(null);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find One And Update', this.collectionName, filter, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tindexes(options: IndexInformationOptions): Promise<any[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('indexes', this.collectionName, JSON.stringify([options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).indexes(options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Indexes', this.collectionName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tindexExists(indexes: string | string[], options?: IndexInformationOptions): Promise<boolean> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('indexExists', this.collectionName, JSON.stringify([indexes, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).indexExists(indexes, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Index Exists', this.collectionName, indexes, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tinsertMany(docs: T[], options?: BulkWriteOptions, bypassLogs = false, bypassCheckSchema = false, bypassMonitor = false): Promise<T[]> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!docs.length) {\n\t\t\t\tresolve([]);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tlet validationResults = [];\n\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tdocs.forEach(doc => {\n\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\tconst isValid = validation.validate(doc);\n\n\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - insertMany', validation.validationErrors());\n\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on insertMany - ' + this.collectionName, [validation.validationErrors(), doc]);\n\t\t\t\t\t\tvalidationResults.push(false);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tvalidationResults.push(true);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlet validDocs = this.checkSchema ? docs.filter((a, idx) => validationResults[idx]) : docs;\n\n\t\t\tfor (let i = 0; i < validDocs.length; i++) {\n\t\t\t\tlet doc = validDocs[i];\n\n\t\t\t\tif (!doc._id) {\n\t\t\t\t\tdoc._id = objectIdHexString();\n\t\t\t\t}\n\n\t\t\t\tif (this.timestamps) {\n\t\t\t\t\tlet date = new Date();\n\n\t\t\t\t\tif (!doc.createdAt) {\n\t\t\t\t\t\tdoc.createdAt = date;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!doc.updatedAt) {\n\t\t\t\t\t\tdoc.updatedAt = date;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this.useVersions && !doc.hasOwnProperty('__v')) {\n\t\t\t\t\tdoc.__v = 0;\n\t\t\t\t}\n\n\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, options])) < 200000 ? JSON.stringify([doc, options], null, 2) : 'Too Big',\n\t\t\t\t\t\tmethod: 'insertMany',\n\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\troute: ''\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (validDocs.length) {\n\t\t\t\tlet monitor = null;\n\t\t\t\t\n\t\t\t\tif (!bypassMonitor) {\n\t\t\t\t\tmonitor = new MonitorMongo('insertMany', this.collectionName, JSON.stringify([validDocs, options]));\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).insertMany(<OptionalUnlessRequiredId<T>[]>validDocs, options).then(res => {\n\t\t\t\t\tif (monitor) {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t}\n\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\tresolve(validDocs);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t}\n\t\t\t\t}, err => {\n\t\t\t\t\tif (monitor) {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t}\n\t\t\t\t\tconsole.log(new Date(), 'Error Insert Many', this.collectionName, validDocs, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tinsertOne(doc: T, options?: InsertOneOptions, bypassLogs = false, bypassCheckSchema = false): Promise<T> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!doc._id) {\n\t\t\t\tdoc._id = objectIdHexString();\n\t\t\t}\n\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(doc);\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - insertOne', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on insertOne - ' + this.collectionName, [validation.validationErrors(), doc]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.timestamps) {\n\t\t\t\tlet date = new Date();\n\t\t\t\n\t\t\t\tif (!doc.createdAt) {\n\t\t\t\t\tdoc.createdAt = date;\n\t\t\t\t}\n\n\t\t\t\tif (!doc.updatedAt) {\n\t\t\t\t\tdoc.updatedAt = date;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\tLogs.insertOne({\n\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\ttype: 'document',\n\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, options])) < 200000 ? JSON.stringify([doc, options], null, 2) : 'Too Big',\n\t\t\t\t\tmethod: 'insertOne',\n\t\t\t\t\tid_user: '',\n\t\t\t\t\tuser: '',\n\t\t\t\t\tmessageId: 0,\n\t\t\t\t\troute: ''\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (this.useVersions && !doc.hasOwnProperty('__v')) {\n\t\t\t\tdoc.__v = 0;\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('insertOne', this.collectionName, JSON.stringify([doc, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).insertOne(<OptionalUnlessRequiredId<T>>doc, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\tresolve(doc);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Insert One', this.collectionName, doc, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tlistIndexes(options?: ListIndexesOptions): ListIndexesCursor {\n\t\tlet monitor = new MonitorMongo('listIndexes', this.collectionName, JSON.stringify([options]));\n\t\tlet cursor = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).listIndexes(options);\n\t\tcursor.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn cursor;\n\t}\n\n\trename(newName: string, options?: RenameOptions): Promise<Collection<Document>> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('rename', this.collectionName, JSON.stringify([newName, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).rename(newName, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Rename', this.collectionName, newName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\treplaceOne(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T>, replacement: T, options?: ReplaceOptions, bypassLogs = false, bypassCheckSchema = false, doc: T = null) : Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(replacement);\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - replaceOne', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on replaceOne - ' + this.collectionName, [validation.validationErrors(), replacement]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tlet date = new Date();\n\t\t\t\n\t\t\tif (this.timestamps) {\n\t\t\t\treplacement.updatedAt = date;\n\t\t\t}\n\n\t\t\tif (this.useVersions) {\n\t\t\t\tif (!doc) {\n\t\t\t\t\tdoc = await this.findOne(<any>filter, null, true);\n\t\t\t\t}\n\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.timestamps && !replacement.createdAt && doc.createdAt) {\n\t\t\t\t\t\treplacement.createdAt = doc.createdAt;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (doc.__v === replacement.__v) {\n\t\t\t\t\t\treplacement.__v += 1;\n\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\n\t\t\t\t\t\tif (doc.__v >= 4) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 4}}]});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, replacement, options])) < 200000 ? JSON.stringify([doc, filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tlet monitor = new MonitorMongo('replaceOne', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).replaceOne(<any>filter, replacement, options).then(res => {\n\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, err => {\n\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\tconsole.log(new Date(), 'Error Replace One', this.collectionName, filter, replacement, options, err);\n\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tconsole.log('invalid version - ' + this.collectionName, doc.__v, replacement.__v);\n\n\t\t\t\t\t\tlet prevDoc = await ResolveIOServer.getMongoManager().collection(this.versionCollection).findOne({\n\t\t\t\t\t\t\t_id: <any>{\n\t\t\t\t\t\t\t\t_id: doc._id,\n\t\t\t\t\t\t\t\t__v: replacement.__v\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, null, true);\n\n\t\t\t\t\t\tif (prevDoc) {\n\t\t\t\t\t\t\tlet docId = doc._id;\n\t\t\t\t\t\t\tlet docVersion = doc.__v;\n\t\t\t\t\t\t\tlet updatedDoc: T = getMongoMergeUpdatedDoc(replacement, doc, prevDoc);\n\t\t\t\t\t\t\tupdatedDoc._id = docId;\n\t\t\t\t\t\t\tupdatedDoc.__v = docVersion + 1;\n\n\t\t\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\tid_document: docId,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['invalidVersion - merge', doc, filter, updatedDoc, options])) < 200000 ? JSON.stringify(['invalidVersion - merge', doc, filter, updatedDoc, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tlet monitor = new MonitorMongo('replaceOne', this.collectionName, JSON.stringify([filter, updatedDoc, options]));\n\t\t\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).replaceOne(<any>filter, updatedDoc, options).then(res => {\n\t\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}, err => {\n\t\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\t\tconsole.log(new Date(), 'Error Replace One', this.collectionName, filter, updatedDoc, options, err);\n\t\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject('Invalid Version And Could Not Find History - DB: ' + doc.__v + ', Trying to update with :' + replacement.__v);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (options && options.upsert) {\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\treplacement.createdAt = date;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!replacement._id) {\n\t\t\t\t\t\treplacement._id = objectIdHexString();\n\t\t\t\t\t}\n\n\t\t\t\t\treplacement.__v = 0;\n\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: replacement._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, replacement, options])) < 200000 ? JSON.stringify(['upsert', filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tlet monitor = new MonitorMongo('replaceOne', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).replaceOne(<any>filter, replacement, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Replace One', this.collectionName, filter, replacement, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject('No Document');\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (options && options.upsert) {\n\t\t\t\t\tif (this.timestamps && !replacement.createdAt) {\n\t\t\t\t\t\treplacement.createdAt = date;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!replacement._id) {\n\t\t\t\t\t\treplacement._id = objectIdHexString();\n\t\t\t\t\t}\n\n\t\t\t\t\treplacement.__v = 0;\n\t\t\t\t}\n\n\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\tif (!options) {\n\t\t\t\t\t\toptions = <FindOneAndReplaceOptions>{returnDocument: 'before'};\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t(<FindOneAndReplaceOptions>options).returnDocument = 'before';\n\t\t\t\t\t}\n\n\t\t\t\t\tlet monitor = new MonitorMongo('findOneAndReplace', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndReplace(<any>filter, replacement, <FindOneAndReplaceOptions>options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tlet doc = res;\n\n\t\t\t\t\t\tif (doc) {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, replacement, options])) < 200000 ? JSON.stringify([doc, filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: replacement._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, replacement, options])) < 200000 ? JSON.stringify(['upsert', filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\tresolve(1);\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Find One And Replace', this.collectionName, filter, replacement, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlet monitor = new MonitorMongo('replaceOne', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).replaceOne(<any>filter, replacement, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Replace One', this.collectionName, filter, replacement, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tupdateMany(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T>, update: MongoManagerUpdateFilter<T>, options?: UpdateOptions, bypassLogs = false, bypassCheckSchema = false, bypassVersions = false) : Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif ((!update.$inc || JSON.stringify(update.$inc) === '{}') && (!update.$set || JSON.stringify(update.$set) === '{}') && (!update.$setOnInsert || JSON.stringify(update.$setOnInsert) === '{}') && (!update.$unset || JSON.stringify(update.$unset) === '{}')) {\n\t\t\t\tresolve(1);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tif (this.timestamps) {\n\t\t\t\tlet date = new Date();\n\n\t\t\t\tif (!update.$set) {\n\t\t\t\t\tupdate.$set = <any>{updatedAt: date};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tupdate.$set.updatedAt = date;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(update, {modifier: true});\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - updateMany', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on updateMany - ' + this.collectionName, [validation.validationErrors(), update]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ((this.useVersions && !bypassVersions) || (this.createLogs && !bypassLogs)) {\n\t\t\t\tlet docs = await this.find(filter);\n\t\n\t\t\t\tfor (let i = 0; i < docs.length; i++) {\n\t\t\t\t\tlet doc = docs[i];\n\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, options])) < 200000 ? JSON.stringify([doc, filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'updateMany',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\t\t\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (doc.__v >= 4) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 4}}]});\n\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\tif (!objectContainsPropertyDeep(update, '__v')) {\n\t\t\t\t\t\t\tif (!update.$inc) {\n\t\t\t\t\t\t\t\tupdate.$inc = {__v: 1};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (!update.$inc.__v) {\n\t\t\t\t\t\t\t\tupdate.$inc.__v = 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('updateMany', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).updateMany(<any>filter, update, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Update Many', this.collectionName, filter, update, options, err);\n\t\t\t\treject(err)\n\t\t\t});\n\t\t});\n\t}\n\n\tupdateOne(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T>, update: MongoManagerUpdateFilter<T>, options?: UpdateOptions, bypassLogs = false, bypassCheckSchema = false) : Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\t\t\t\n\t\t\t\tconst isValid = validation.validate(update, {modifier: true});\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - updateOne', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on updateOne - ' + this.collectionName, [validation.validationErrors(), update]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ((!update.$inc || JSON.stringify(update.$inc) === '{}') && (!update.$set || JSON.stringify(update.$set) === '{}') && (!update.$setOnInsert || JSON.stringify(update.$setOnInsert) === '{}') && (!update.$unset || JSON.stringify(update.$unset) === '{}')) {\n\t\t\t\tresolve(1);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet date = new Date();\n\n\t\t\tif (this.timestamps) {\n\t\t\t\tif (!update.$set) {\n\t\t\t\t\tupdate.$set = <any>{updatedAt: date};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tupdate.$set.updatedAt = date;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif (this.useVersions) {\n\t\t\t\tlet doc = await this.findOne(filter, null, true);\n\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, options])) < 200000 ? JSON.stringify([doc, filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\t\n\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t\n\t\t\t\t\tif (doc.__v >= 4) {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 4}}]});\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (!objectContainsPropertyDeep(update, '__v')) {\n\t\t\t\t\t\tif (!update.$inc) {\n\t\t\t\t\t\t\tupdate.$inc = {__v: 1};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (!update.$inc.__v) {\n\t\t\t\t\t\t\tupdate.$inc.__v = 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tlet monitor = new MonitorMongo('updateOne', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).updateOne(<any>filter, update, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Update One', this.collectionName, filter, update, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (options && options.upsert) {\n\t\t\t\t\tif (!update.$setOnInsert) {\n\t\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t__v: 0,\n\t\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t__v: 0\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (!update.$setOnInsert._id) {\n\t\t\t\t\t\t\tupdate.$setOnInsert._id = objectIdHexString();\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif (this.timestamps && !update.$setOnInsert.createdAt) {\n\t\t\t\t\t\t\tupdate.$setOnInsert.createdAt = new Date();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: update.$setOnInsert._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, update, options])) < 200000 ? JSON.stringify(['upsert', filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tlet monitor = new MonitorMongo('updateOne', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).updateOne(<any>filter, update, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Update One', this.collectionName, filter, update, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject('No Document');\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (options && options.upsert) {\n\t\t\t\t\tif (!update.$setOnInsert) {\n\t\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString()\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (!update.$setOnInsert._id) {\n\t\t\t\t\t\t\tupdate.$setOnInsert._id = objectIdHexString();\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif (this.timestamps && !update.$setOnInsert.createdAt) {\n\t\t\t\t\t\t\tupdate.$setOnInsert.createdAt = new Date();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\tif (!options) {\n\t\t\t\t\t\toptions = <FindOneAndUpdateOptions>{returnDocument: 'before'};\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t(<FindOneAndUpdateOptions>options).returnDocument = 'before';\n\t\t\t\t\t}\n\n\t\t\t\t\tlet monitor = new MonitorMongo('findOneAndUpdate', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).findOneAndUpdate(<any>filter, update, <FindOneAndUpdateOptions>options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tlet doc = res.value;\n\n\t\t\t\t\t\tif (doc) {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: <any>doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, options])) < 200000 ? JSON.stringify([doc, filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tresolve(res.ok);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (update.$setOnInsert) {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: update.$setOnInsert._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, update, options])) < 200000 ? JSON.stringify(['upsert', filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\n\t\t\t\t\t\t\tresolve(res.ok);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tresolve(0);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Find One And Update', this.collectionName, filter, update, options, err);\n\t\t\t\t\t\treject(err)\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlet monitor = new MonitorMongo('updateOne', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).updateOne(<any>filter, update, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Update One', this.collectionName, filter, update, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\t\n\twatchCollection(pipeline = [], options?: ChangeStreamOptions): ChangeStream<T> {\n\t\tlet stream = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).watch(pipeline, options);\n\t\treturn <ChangeStream<T>>stream;\n\t}\n}\n\nexport class MongoManagerUserCollection<T extends CollectionDocument> extends MongoManagerCollection<T> {\n\tauthenticate(user: UserModel, password: string): Promise<{data: UserModel, error: string}> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tconst attemptsInterval = Math.pow(100, Math.log(user.attempts + 1));\n\t\t\tconst calculatedInterval = attemptsInterval < 300000 ? attemptsInterval : 300000;\n\t\t\n\t\t\tif (user.last) {\n\t\t\t\tif (Date.now() - user.last.getTime() < calculatedInterval) {\n\t\t\t\t\tuser.last = new Date();\n\t\t\t\t\tawait Users.updateOne({_id: user._id}, {$set: {last: user.last}});\n\t\t\t\t\tresolve({\n\t\t\t\t\t\tdata: null,\n\t\t\t\t\t\terror: 'Attempt Too Soon'\n\t\t\t\t\t});\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tuser.last = new Date();\n\t\t\t}\n\t\t\n\t\t\tif (user.attempts >= 5) {\n\t\t\t\tresolve({\n\t\t\t\t\tdata: null,\n\t\t\t\t\terror: 'Too Many Attempts'\n\t\t\t\t});\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tif (!user.salt) {\n\t\t\t\tresolve({\n\t\t\t\t\tdata: null,\n\t\t\t\t\terror: 'No Salt Value Stored'\n\t\t\t\t});\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tpbkdf2(password, user.salt, {\n\t\t\t\titerations: 25000,\n\t\t\t\tkeylen: 512,\n\t\t\t\tdigestAlgorithm: 'sha256'\n\t\t\t}, async (err, hashBuffer) => {\n\t\t\t\tif (err) {\n\t\t\t\t\treturn reject(err);\n\t\t\t\t}\n\t\t\t\n\t\t\t\tif (scmp(hashBuffer, Buffer.from(user.hash, 'hex'))) {\n\t\t\t\t\tuser.last = new Date();\n\t\t\t\t\tuser.attempts = 0;\n\t\t\t\t\tawait Users.updateOne({_id: user._id}, {$set: {last: user.last, attempts: user.attempts}});\n\n\t\t\t\t\tresolve({\n\t\t\t\t\t\tdata: user,\n\t\t\t\t\t\terror: ''\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tuser.last = new Date();\n\t\t\t\t\tuser.attempts = user.attempts + 1;\n\t\t\t\t\tawait Users.updateOne({_id: user._id}, {$set: {last: user.last, attempts: user.attempts}});\n\n\t\t\t\t\tif (user.attempts >= 5) {\n\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\tdata: null,\n\t\t\t\t\t\t\terror: 'Too Many Attempts'\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\tdata: null,\n\t\t\t\t\t\t\terror: 'Invalid Username And Password'\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t});\n\t\t});\n\t}\n\n\tserializeUser() {\n\t\treturn (user, cb) => {\n\t\t\tcb(null, user.username);\n\t\t};\n\t}\n\n\tdeserializeUser() {\n\t\treturn (username, cb) => {\n\t\t\tUsers.findOne({username: username}).then(res => {\n\t\t\t\tcb(null, res);\n\t\t\t}, err => {\n\t\t\t\tcb(err, null);\n\t\t\t});\n\t\t};\n\t}\n\n\tsetPassword(user: UserModel, password: string) {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!user) {\n\t\t\t\treject('No User');\n\t\t\t}\n\t\t\telse if (!password) {\n\t\t\t\treject('No Password');\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet saltBuffer = await randomBytes(32);\n\t\t\t\tlet salt = saltBuffer.toString('hex');\n\t\t\t\tlet hashRaw = await pbkdf2Promisified(password, salt, {\n\t\t\t\t\titerations: 25000,\n\t\t\t\t\tkeylen: 512,\n\t\t\t\t\tdigestAlgorithm: 'sha256'\n\t\t\t\t});\n\t\t\t\tlet hash = Buffer.from(hashRaw, 'binary').toString('hex');\n\t\t\t\tUsers.updateOne({_id: user._id}, {$set: {hash: hash, salt: salt, services: {}, attempts: 0}}).then(res => resolve(res), rej => reject(rej));\n\t\t\t}\n\t\t});\n\t};\n\n\tchangePassword(user, oldPassword, newPassword) {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!user) {\n\t\t\t\treject('Missing User');\n\t\t\t}\n\t\t\telse if (!oldPassword || !newPassword) {\n\t\t\t\treject('Missing Password');\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet authUser = await this.authenticate(user, oldPassword);\n\n\t\t\t\tif (!authUser['data']) {\n\t\t\t\t\treject(authUser['error']);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.setPassword(user, newPassword).then(res => resolve(res), rej => reject(rej));\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\t\n\tregister(user, password) {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!user.username) {\n\t\t\t\treject('Missing Username');\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet dbUser = await Users.findOne({username: user.username});\n\t\t\t\t\n\t\t\t\tif (dbUser) {\n\t\t\t\t\treject('Username Exists');\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tdbUser = await Users.findOne({email: user.email});\n\n\t\t\t\t\tif (dbUser) {\n\t\t\t\t\t\treject('Email Exists');\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tuser.setPassword(password);\n\t\t\t\t\t\tresolve(user);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tresetAttempts(user: UserModel) {\n\t\treturn Users.updateOne({_id: user._id}, {$set: {attempts: 0}});\n\t}\n}\n\nexport function objectIdHexString() {\n\tlet objectId = new ObjectId();\n\treturn objectId.toHexString();\n}\n\nfunction pbkdf2(password, salt, options, callback) {\n\tcrypto.pbkdf2(password, salt, options.iterations, options.keylen, options.digestAlgorithm, callback);\n};\n\nfunction pbkdf2Promisified(password, salt, options): Promise<any> {\n\treturn new Promise((resolve, reject) => pbkdf2(password, salt, options, (err, hashRaw) => (err ? reject(err) : resolve(hashRaw))));\n}\n\nfunction randomBytes(saltlen): Promise<Buffer> {\n\treturn new Promise((resolve, reject) => crypto.randomBytes(saltlen, (err, saltBuffer) => (err ? reject(err) : resolve(saltBuffer))));\n}\n\nfunction objectContainsPropertyDeep(obj: Object, prop: string) {\n\tlet keys = Object.keys(obj);\n\n\tif (keys.some(a => a === prop)) {\n\t\treturn true;\n\t}\n\t\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tlet key = keys[i];\n\t\tif (obj[key] && typeof obj[key] === 'object' && objectContainsPropertyDeep(obj[key], prop)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}"]}