@resolveio/server-lib 20.4.61 → 20.4.62

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","sift_1","MongoManager","serverConfig","this","_collections","_cacheMap","_operationInProgress","Map","_heapSize","getHeapStatistics","_serverCollections","_serverConfig","_isWorkersEnabled","_isWorkerInstance","_nodeCache","stdTTL","checkperiod","process","env","IS_WORKERS_ENABLED","IS_WORKER_INSTANCE","setCacheLimit","initServerCollections","setupChangeStream","prototype","_heapLimit","ResolveIOServer","getMainDB","listCollections","toArray","collections","_a","sent","getServerCollections","registerCollection","collection","_this","collectionOptions","timeseries","timeField","some","a","name","collectionName","type","dropCollection","then","createCollection","push","find","delay","ms","Promise","resolve","setTimeout","filter","options","cacheKey","generateCacheKey","undefined","result","getFromCache","has","get","promise","operation","executeFind","set","invalidatedDuringExecution","finally","delete","monitor","MonitorMongo","JSON","stringify","finish","addToCache","findOne","executeFindOne","aggregate","pipeline","__spreadArray","__read","flatMap","stage","$lookup","from","executeAggregate","countDocuments","executeCountDocuments","functionName","args","keyString","createHash","update","digest","cachedData","parse","dateReviver","error","del","data","getBinarySize","nodeCacheSize","getStats","vsize","deleteCount","keys","keys_1","__values","keys_1_1","next","done","key","value","console","log","invalidateQueryCache","collectionCacheMap","includes","collectionCacheMap_1","collectionCacheMap_1_1","cacheMap","changeStream","watch","$match","$and","ns.coll","$nin","$not","on","change","__awaiter","coll","err","Date","close","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","setInterval","getMainServer","getMongoManager","clearInterval","extractIndexNameFromError","errorMessage","matches","match","skipCache","reject","monitor_1","res","aggregateCount","aggregateCursor","cursor","ev","aggregateStream","streamOptions","stream","bulkWrite","operations","bypassLogs","bypassCheckSchema","bypassVersions","bulkOps","logs","modifiedIds","Set","additionalFilters","fieldNamesSet","opIndex","op","opType","Object","doc","document","objectIdHexString","__v","date","createdAt","updatedAt","validation","newContext","validate","Error","concat","validationErrors","insertOne","id_document","payload","method","id_user","user","messageId","route","add","$set","$inc","upsert","$setOnInsert","modifier","replacement","isSingle","extractFieldNames","isUpdateMany","insertMany","isDeleteMany","combinedFilter","$or","map","item","projection_1","forEach","field","projection","docs","_h","docs_1","docs_1_1","e_4","additionalFilters_1","additionalFilters_1_1","mainResult","size","modifiedIdsArray","Array","$in","$addFields","$project","$merge","into","whenMatched","whenNotMatched","$sort","$group","$push","docsToDelete","$slice","$size","$unwind","$replaceRoot","newRoot","oldVersions","deleteMany","expandedLogs","logs_1","logs_1_1","e_6","_b","_c","Logs","ordered","err_1","prefix","startsWith","isArray","subFilter","fullPath","estimatedDocumentCount","monitor_2","err_2","create","f_docs","fieldOrSpec","indexes","existingIndexes","index","indexQueue","action","specs","err_3","createIndexes","indexSpecs","existingIndexes_1","indexesToCreate","indexSpec","existingIndex","err_4","i","versionDoc","replaceOne","$lt","acknowledged","deletedCount","deleteOne","monitor_3","findOneAndDelete","returnVal","monitor_4","distinct","drop","dropIndex","indexName","dropIndexes","monitor_5","findById","id","findCount","count","findCursor","removeAllListeners","findStream","monitor_6","findOneAndReplace","getMethodManager","callMethodInternal","call","findOneAndUpdate","indexExists","bypassMonitor","validationResults","validDocs","idx","hasOwnProperty","monitor_7","listIndexes","rename","newName","monitor_8","modifiedCount","prevDoc","docId","docVersion","updatedDoc_1","getMongoMergeUpdatedDoc","monitor_9","monitor_10","returnDocument","monitor_11","monitor_12","updateMany","$unset","objectContainsPropertyDeep","updateOne","monitor_13","monitor_14","monitor_15","ok","monitor_16","watchCollection","queue","task","callback","dbCollection","apply","code","err_5","message","existingIndexName","innerError_1","_super","__extends","authenticate","password","attemptsInterval","Math","pow","attempts","calculatedInterval","last","now","getTime","Users","salt","pbkdf2","iterations","keylen","digestAlgorithm","hashBuffer","Buffer","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, ChangeStreamDocument } 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';\nimport sift from 'sift';\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: { collections: string[], key: string }[] = [];\n\tprivate _operationInProgress: Map<string, { promise: Promise<any>, invalidatedDuringExecution: boolean }> = new Map();\n\tprivate _heapSize = v8.getHeapStatistics() / numCPUs;\n\tprivate _heapLimit: number;\n\tprivate _serverCollections: (CollectionInfo | Pick<CollectionInfo, 'name' | 'type'>)[] = [];\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\t\tthis.setCacheLimit();\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\tthis._heapLimit = this._isWorkerInstance ? this._heapSize * 0.8 : this._heapSize * 0.4;\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\tprivate async delay(ms: number) {\n\t\treturn new Promise(resolve => setTimeout(resolve, ms));\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\tconst cacheKey = this.generateCacheKey([collectionName], 'find', [filter, options]);\n\t\tlet result = this.getFromCache(cacheKey);\n\t\tif (result !== undefined) {\n\t\t\treturn result;\n\t\t}\n\n\t\tif (this._operationInProgress.has(cacheKey)) {\n\t\t\treturn this._operationInProgress.get(cacheKey).promise;\n\t\t}\n\n\t\tconst operation = this.executeFind<T>(collectionName, filter, options, cacheKey);\n\t\tthis._operationInProgress.set(cacheKey, { promise: operation, invalidatedDuringExecution: false });\n\n\t\toperation.finally(() => this._operationInProgress.delete(cacheKey));\n\n\t\treturn operation;\n\t}\n\n\tprivate async executeFind<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> & MongoManagerFilterOperators<T>,\n\t\toptions: FindOptions<T> | undefined,\n\t\tcacheKey: string\n\t): Promise<T[]> {\n\t\tlet result;\n\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\n\t\tconst monitor = new MonitorMongo('find', collectionName, JSON.stringify([filter, options]));\n\t\tresult = await collection.find(<any>filter, options).toArray();\n\t\tmonitor.finish();\n\t\n\t\tif (!this._operationInProgress.get(cacheKey).invalidatedDuringExecution) {\n\t\t\tthis.addToCache([collectionName], cacheKey, result);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t// FindOne Operation\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\tconst cacheKey = this.generateCacheKey([collectionName], 'findOne', [filter, options]);\n\t\tlet result = this.getFromCache(cacheKey);\n\t\tif (result !== undefined) {\n\t\t\treturn result;\n\t\t}\n\n\t\tif (this._operationInProgress.has(cacheKey)) {\n\t\t\treturn this._operationInProgress.get(cacheKey).promise;\n\t\t}\n\n\t\tconst operation = this.executeFindOne<T>(collectionName, filter, options, cacheKey);\n\t\tthis._operationInProgress.set(cacheKey, { promise: operation, invalidatedDuringExecution: false });\n\n\t\toperation.finally(() => this._operationInProgress.delete(cacheKey));\n\n\t\treturn operation;\n\t}\n\n\tprivate async executeFindOne<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> | MongoManagerFilterOperators<T>,\n\t\toptions: FindOptions<T> | undefined,\n\t\tcacheKey: string\n\t): Promise<T> {\n\t\tlet result;\n\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\n\t\tconst monitor = new MonitorMongo('findOne', collectionName, JSON.stringify([filter, options]));\n\t\tresult = await collection.findOne(<any>filter, options);\n\t\tmonitor.finish();\n\t\n\t\tif (!this._operationInProgress.get(cacheKey).invalidatedDuringExecution) {\n\t\t\tthis.addToCache([collectionName], cacheKey, result);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t// Aggregate Operation\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\tconst collections = [collectionName, ...pipeline.flatMap(stage => stage.$lookup?.from ? [stage.$lookup.from] : [])];\n\t\tconst cacheKey = this.generateCacheKey(collections, 'aggregate', [pipeline, options]);\n\t\tlet result = this.getFromCache(cacheKey);\n\t\tif (result !== undefined) {\n\t\t\treturn result;\n\t\t}\n\n\t\tif (this._operationInProgress.has(cacheKey)) {\n\t\t\treturn this._operationInProgress.get(cacheKey).promise;\n\t\t}\n\n\t\tconst operation = this.executeAggregate<T>(collectionName, pipeline, options, cacheKey, collections);\n\t\tthis._operationInProgress.set(cacheKey, { promise: operation, invalidatedDuringExecution: false });\n\n\t\toperation.finally(() => this._operationInProgress.delete(cacheKey));\n\n\t\treturn operation;\n\t}\n\n\tprivate async executeAggregate<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tpipeline: any[],\n\t\toptions: AggregateOptions | undefined,\n\t\tcacheKey: string,\n\t\tcollections: string[]\n\t): Promise<any[]> {\n\t\tlet result;\n\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\n\t\tconst monitor = new MonitorMongo('aggregate', collectionName, JSON.stringify([pipeline, options]));\n\t\tresult = await collection.aggregate(pipeline, options).toArray();\n\t\tmonitor.finish();\n\n\t\tif (!this._operationInProgress.get(cacheKey).invalidatedDuringExecution) {\n\t\t\tthis.addToCache(collections, cacheKey, result);\n\t\t}\n\t\t\n\t\treturn result;\n\t}\n\n\tpublic async countDocuments<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> | MongoManagerFilterOperators<T> = {},\n\t\toptions?: CountDocumentsOptions\n\t): Promise<number> {\n\t\tconst cacheKey = this.generateCacheKey([collectionName], 'countDocuments', [filter, options]);\n\t\tlet result = this.getFromCache(cacheKey);\n\t\tif (result !== undefined) {\n\t\t\treturn result;\n\t\t}\n\n\t\tif (this._operationInProgress.has(cacheKey)) {\n\t\t\treturn this._operationInProgress.get(cacheKey).promise;\n\t\t}\n\n\t\tconst operation = this.executeCountDocuments<T>(collectionName, filter, options, cacheKey);\n\t\tthis._operationInProgress.set(cacheKey, { promise: operation, invalidatedDuringExecution: false });\n\n\t\toperation.finally(() => this._operationInProgress.delete(cacheKey));\n\n\t\treturn operation;\n\t}\n\n\tprivate async executeCountDocuments<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> | MongoManagerFilterOperators<T>,\n\t\toptions: CountDocumentsOptions,\n\t\tcacheKey: string\n\t): Promise<number> {\n\t\tlet result;\n\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\n\t\tconst monitor = new MonitorMongo('countDocuments', collectionName, JSON.stringify([filter, options]));\n\t\tresult = await collection.countDocuments(<any>filter, options);\n\t\tmonitor.finish();\n\t\n\t\tif (!this._operationInProgress.get(cacheKey).invalidatedDuringExecution) {\n\t\t\tthis.addToCache([collectionName], cacheKey, result);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t// Cache and Invalidation Setup\n\tprivate generateCacheKey(collections: string[], functionName: string, args: any[]): string {\n\t\tconst keyString = JSON.stringify({ collections, 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\tthis._nodeCache.del(cacheKey);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate addToCache(collections: 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\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\t\t\t\n\t\t\tthis._nodeCache.set(cacheKey, JSON.stringify(data));\n\t\t\tthis._cacheMap.push({ collections, key: cacheKey });\n\t\t}\n\t}\n\n\tpublic invalidateQueryCache(collection: string) {\n\t\tconst collectionCacheMap = this._cacheMap.filter(a => a.collections.includes(collection));\n\n\t\tfor (const cacheMap of collectionCacheMap) {\n\t\t\tthis._nodeCache.del(cacheMap.key);\n\t\t\t\n\t\t\tif (this._operationInProgress.has(cacheMap.key)) {\n\t\t\t\tthis._operationInProgress.get(cacheMap.key).invalidatedDuringExecution = true;\n\t\t\t}\n\t\t}\n\n\t\tthis._cacheMap = this._cacheMap.filter(a => !a.collections.includes(collection));\n\t}\n\n\tprivate setupChangeStream() {\n\t\tconst db = ResolveIOServer.getMainDB();\n\n\t\tconst pipeline = [\n\t\t\t{\n\t\t\t\t$match: {\n\t\t\t\t\t$and: [\n\t\t\t\t\t\t{'ns.coll': { $nin: ['logs', 'log-method-latencies', 'log-subscriptions'] }},\n\t\t\t\t\t\t{'ns.coll': { $not: /.*\\.versions$/ }},\n\t\t\t\t\t\t{'ns.coll': { $not: /^monitor-/ }},\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t\tconst changeStream = db.watch(pipeline);\n\n\t\tchangeStream.on('change', async (change: ChangeStreamDocument) => {\n\t\t\tif (change['ns'] && change['ns'].coll) {\n\t\t\t\tconst collectionName = change['ns'].coll;\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);\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);\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\t\tconst { action, collection, specs, options } = task;\n\t\tconst dbCollection = ResolveIOServer.getMainDB().collection(collection.collectionName, collection.collectionOptions);\n\t\n\t\tif (!dbCollection) {\n\t\t\treturn callback(new Error(`Collection ${collection.collectionName} not found`));\n\t\t}\n\t\n\t\tlet monitor = new MonitorMongo(action, collection.collectionName, JSON.stringify([specs, options]));\n\t\n\t\ttry {\n\t\t\t// Try creating the index, will auto-skip if already checked in createIndex/createIndexes\n\t\t\tconst result = await dbCollection[action](...specs, options);\n\t\t\tmonitor.finish();\n\t\t\tcallback(null, result);\n\t\t} catch (err) {\n\t\t\t// Handle any specific errors related to index creation\n\t\t\tif (err.code === 85 || err.message.includes('IndexOptionsConflict')) {\n\t\t\t\ttry {\n\t\t\t\t\tconst existingIndexName = collection.extractIndexNameFromError(err.message);\n\t\t\t\t\tif (existingIndexName) {\n\t\t\t\t\t\tawait dbCollection.dropIndex(existingIndexName);\n\t\t\t\t\t\tconst result = await dbCollection[action](...specs, options);\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tcallback(null, result);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t} catch (innerError) {\n\t\t\t\t\tcallback(innerError);\n\t\t\t\t}\n\t\t\t}\n\t\t\tmonitor.finish();\n\t\t\tcallback(err);\n\t\t}\n\t}, 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\tasync bulkWrite(\n\t\toperations: any[],\n\t\toptions?: BulkWriteOptions,\n\t\tbypassLogs = false,\n\t\tbypassCheckSchema = false,\n\t\tbypassVersions = false\n\t): Promise<BulkWriteResult> {\n\t\tif (!operations.length) {\n\t\t\treturn null;\n\t\t}\n\t\n\t\tconst bulkOps = [];\n\t\tconst logs = [];\n\t\tconst modifiedIds = new Set<string>();\n\t\n\t\tconst additionalFilters = [];\n\t\tconst fieldNamesSet = new Set<string>();\n\t\n\t\t// Prepare bulk operations and collect modified IDs\n\t\tfor (let opIndex = 0; opIndex < operations.length; opIndex++) {\n\t\t\tconst op = operations[opIndex];\n\t\t\tconst opType = Object.keys(op)[0];\n\t\t\tconst doc = op[opType];\n\t\n\t\t\tif (opType === 'insertOne') {\n\t\t\t\t// Handle insertOne\n\t\t\t\tif (!doc.document._id) {\n\t\t\t\t\tdoc.document._id = objectIdHexString();\n\t\t\t\t}\n\t\t\t\tif (this.useVersions && doc.document.__v === undefined) {\n\t\t\t\t\tdoc.document.__v = 0;\n\t\t\t\t}\n\t\t\t\tif (this.timestamps) {\n\t\t\t\t\tconst date = new Date();\n\t\t\t\t\tdoc.document.createdAt = doc.document.createdAt || date;\n\t\t\t\t\tdoc.document.updatedAt = doc.document.updatedAt || date;\n\t\t\t\t}\n\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\tif (!validation.validate(doc.document)) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Schema validation failed for insertOne: ${JSON.stringify(validation.validationErrors())}`\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbulkOps.push(op);\n\t\n\t\t\t\t// Collect logs if necessary\n\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\tlogs.push({\n\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\tdocument: {\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.document._id,\n\t\t\t\t\t\t\t\tpayload:\n\t\t\t\t\t\t\t\t\tgetBinarySize(JSON.stringify([op, options])) < 200000\n\t\t\t\t\t\t\t\t\t\t? JSON.stringify([op, options], null, 2)\n\t\t\t\t\t\t\t\t\t\t: 'Too Big',\n\t\t\t\t\t\t\t\tmethod: opType,\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});\n\t\t\t\t}\n\t\n\t\t\t\t// Track inserted IDs for versioning\n\t\t\t\tif (!bypassVersions && this.useVersions) {\n\t\t\t\t\tmodifiedIds.add(doc.document._id);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (opType === 'updateOne' || opType === 'replaceOne') {\n\t\t\t\t// Handle updateOne and replaceOne\n\t\t\t\tif (opType === 'updateOne') {\n\t\t\t\t\tif (!doc.update.$set) doc.update.$set = {};\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tdoc.update.$set.updatedAt = new Date();\n\t\t\t\t\t}\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tif (!doc.update.$inc) doc.update.$inc = {};\n\t\t\t\t\t\tdoc.update.$inc.__v = 1;\n\t\t\t\t\t}\n\t\t\t\t\tif (doc.upsert) {\n\t\t\t\t\t\tif (!doc.update.$setOnInsert) doc.update.$setOnInsert = {};\n\t\t\t\t\t\tif (!doc.update.$setOnInsert._id) doc.update.$setOnInsert._id = objectIdHexString();\n\t\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\t\tdoc.update.$setOnInsert.createdAt = new Date();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\tdoc.update.$setOnInsert.__v = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\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\tif (!validation.validate(doc.update, { modifier: true })) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`Schema validation failed for updateOne: ${JSON.stringify(validation.validationErrors())}`\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\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\tif (doc.upsert && !doc.replacement.createdAt) {\n\t\t\t\t\t\t\tdoc.replacement.createdAt = new Date();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tdoc.replacement.__v = doc.replacement.__v !== undefined ? doc.replacement.__v + 1 : 0;\n\t\t\t\t\t}\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\tif (!validation.validate(doc.replacement)) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`Schema validation failed for replaceOne: ${JSON.stringify(validation.validationErrors())}`\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\tbulkOps.push(op);\n\t\n\t\t\t\t// Collect logs if necessary\n\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\tlet id_document = '';\n\t\t\t\t\tif (doc.filter && doc.filter._id) {\n\t\t\t\t\t\tid_document = doc.filter._id;\n\t\t\t\t\t\t// Track modified IDs for versioning\n\t\t\t\t\t\tif (!bypassVersions && this.useVersions) {\n\t\t\t\t\t\t\tmodifiedIds.add(doc.filter._id);\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\t// Collect filters for additional querying\n\t\t\t\t\t\tadditionalFilters.push({ filter: doc.filter, opIndex: logs.length, isSingle: true });\n\t\t\t\t\t\t// Extract field names from filter\n\t\t\t\t\t\tthis.extractFieldNames(doc.filter, fieldNamesSet);\n\t\t\t\t\t}\n\t\n\t\t\t\t\tlogs.push({\n\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\tdocument: {\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: id_document,\n\t\t\t\t\t\t\t\tpayload:\n\t\t\t\t\t\t\t\t\tgetBinarySize(JSON.stringify([op, options])) < 200000\n\t\t\t\t\t\t\t\t\t\t? JSON.stringify([op, options], null, 2)\n\t\t\t\t\t\t\t\t\t\t: 'Too Big',\n\t\t\t\t\t\t\t\tmethod: opType,\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});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// Even if not logging, we need to track modified IDs for versioning\n\t\t\t\t\tif (!bypassVersions && doc.filter && doc.filter._id && this.useVersions) {\n\t\t\t\t\t\tmodifiedIds.add(doc.filter._id);\n\t\t\t\t\t}\n\t\t\t\t\telse if (!bypassVersions && this.useVersions) {\n\t\t\t\t\t\t// Need to collect filters to fetch _id later\n\t\t\t\t\t\tadditionalFilters.push({ filter: doc.filter, opIndex: null, isSingle: true });\n\t\t\t\t\t\tthis.extractFieldNames(doc.filter, fieldNamesSet);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (opType === 'updateMany') {\n\t\t\t\t// Handle updateMany\n\t\t\t\tif (!doc.update.$set) doc.update.$set = {};\n\t\t\t\tif (this.timestamps) {\n\t\t\t\t\tdoc.update.$set.updatedAt = new Date();\n\t\t\t\t}\n\t\t\t\tif (this.useVersions) {\n\t\t\t\t\tif (!doc.update.$inc) doc.update.$inc = {};\n\t\t\t\t\tdoc.update.$inc.__v = 1;\n\t\t\t\t}\n\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\tif (!validation.validate(doc.update, { modifier: true })) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Schema validation failed for updateMany: ${JSON.stringify(validation.validationErrors())}`\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbulkOps.push(op);\n\t\n\t\t\t\t// Collect logs if necessary\n\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t// We need to fetch the affected documents to get their _id\n\t\t\t\t\tadditionalFilters.push({ filter: doc.filter, opIndex: logs.length, isUpdateMany: true });\n\t\t\t\t\t// Extract field names from filter\n\t\t\t\t\tthis.extractFieldNames(doc.filter, fieldNamesSet);\n\t\n\t\t\t\t\tlogs.push({\n\t\t\t\t\t\tinsertMany: [] // We will populate this after fetching documents\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (!bypassVersions && this.useVersions) {\n\t\t\t\t\t// Need to collect filters to fetch _id for versioning\n\t\t\t\t\tadditionalFilters.push({ filter: doc.filter, opIndex: null, isUpdateMany: true });\n\t\t\t\t\tthis.extractFieldNames(doc.filter, fieldNamesSet);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (opType === 'deleteOne' || opType === 'deleteMany') {\n\t\t\t\t// Handle deleteOne and deleteMany\n\t\t\t\tbulkOps.push(op);\n\t\n\t\t\t\t// Collect logs if necessary\n\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\tlet id_document = '';\n\t\t\t\t\tif (doc.filter && doc.filter._id) {\n\t\t\t\t\t\tid_document = doc.filter._id;\n\t\t\t\t\t\t// Track modified IDs for versioning\n\t\t\t\t\t\tif (!bypassVersions && this.useVersions) {\n\t\t\t\t\t\t\tmodifiedIds.add(doc.filter._id);\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\t// Collect filters for additional querying\n\t\t\t\t\t\tadditionalFilters.push({ filter: doc.filter, opIndex: logs.length, isDeleteMany: opType === 'deleteMany' });\n\t\t\t\t\t\t// Extract field names from filter\n\t\t\t\t\t\tthis.extractFieldNames(doc.filter, fieldNamesSet);\n\t\t\t\t\t}\n\t\n\t\t\t\t\tlogs.push({\n\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\tdocument: {\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: id_document,\n\t\t\t\t\t\t\t\tpayload:\n\t\t\t\t\t\t\t\t\tgetBinarySize(JSON.stringify([op, options])) < 200000\n\t\t\t\t\t\t\t\t\t\t? JSON.stringify([op, options], null, 2)\n\t\t\t\t\t\t\t\t\t\t: 'Too Big',\n\t\t\t\t\t\t\t\tmethod: opType,\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});\n\t\t\t\t}\n\t\t\t\tif (!bypassVersions && this.useVersions) {\n\t\t\t\t\tif (doc.filter && doc.filter._id) {\n\t\t\t\t\t\tmodifiedIds.add(doc.filter._id);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t// Need to collect filters to fetch _id for versioning\n\t\t\t\t\t\tadditionalFilters.push({ filter: doc.filter, opIndex: null, isDeleteMany: opType === 'deleteMany' });\n\t\t\t\t\t\tthis.extractFieldNames(doc.filter, fieldNamesSet);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthrow new Error(`Unsupported operation type: ${opType}`);\n\t\t\t}\n\t\t}\n\t\n\t\ttry {\n\t\t\t// Fetch necessary fields for logs and versioning where required\n\t\t\tif (!bypassVersions && additionalFilters.length) {\n\t\t\t\t// Combine all filters into one query using $or\n\t\t\t\tconst combinedFilter = {\n\t\t\t\t\t$or: additionalFilters.map(item => item.filter)\n\t\t\t\t};\n\t\n\t\t\t\t// Build the projection object with necessary fields\n\t\t\t\tconst projection: any = { _id: 1 };\n\t\t\t\tfieldNamesSet.forEach(field => {\n\t\t\t\t\tprojection[field] = 1;\n\t\t\t\t});\n\t\n\t\t\t\t// Fetch matching documents with necessary fields\n\t\t\t\tconst cursor = ResolveIOServer.getMainDB()\n\t\t\t\t\t.collection<T>(this.collectionName)\n\t\t\t\t\t.find(combinedFilter, { projection });\n\t\n\t\t\t\tconst docs = await cursor.toArray();\n\t\n\t\t\t\t// Map documents to their filters\n\t\t\t\tfor (const doc of docs) {\n\t\t\t\t\t// For each filter, check if it matches this document\n\t\t\t\t\tfor (const item of additionalFilters) {\n\t\t\t\t\t\tif (sift(item.filter)(doc)) {\n\t\t\t\t\t\t\tif (item.opIndex !== null) {\n\t\t\t\t\t\t\t\t// For logs\n\t\t\t\t\t\t\t\tif (item.isUpdateMany || item.isDeleteMany) {\n\t\t\t\t\t\t\t\t\t// For updateMany and deleteMany, we collect multiple documents\n\t\t\t\t\t\t\t\t\tif (!logs[item.opIndex].insertMany) {\n\t\t\t\t\t\t\t\t\t\tlogs[item.opIndex].insertMany = [];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tlogs[item.opIndex].insertMany.push({\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: doc._id,\n\t\t\t\t\t\t\t\t\t\tpayload:\n\t\t\t\t\t\t\t\t\t\t\tgetBinarySize(JSON.stringify([operations[item.opIndex], options])) < 200000\n\t\t\t\t\t\t\t\t\t\t\t\t? JSON.stringify([operations[item.opIndex], options], null, 2)\n\t\t\t\t\t\t\t\t\t\t\t\t: 'Too Big',\n\t\t\t\t\t\t\t\t\t\tmethod: operations[item.opIndex] ? Object.keys(operations[item.opIndex])[0] : '',\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\telse if (item.isSingle) {\n\t\t\t\t\t\t\t\t\t// For updateOne and deleteOne without _id in filter\n\t\t\t\t\t\t\t\t\tlogs[item.opIndex].insertOne.document.id_document = doc._id;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// For versioning\n\t\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\t\tmodifiedIds.add(<string>doc._id);\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\t\n\t\t\t// Perform the bulkWrite operations\n\t\t\tconst mainResult = await ResolveIOServer.getMainDB()\n\t\t\t\t.collection<T>(this.collectionName)\n\t\t\t\t.bulkWrite(bulkOps, options);\n\t\n\t\t\t// Versioning using aggregation pipeline\n\t\t\tif (!bypassVersions && this.useVersions && modifiedIds.size > 0) {\n\t\t\t\tconst modifiedIdsArray = Array.from(modifiedIds);\n\t\n\t\t\t\t// Create versions using aggregation\n\t\t\t\tResolveIOServer.getMainDB()\n\t\t\t\t\t.collection<T>(this.collectionName)\n\t\t\t\t\t.aggregate([\n\t\t\t\t\t\t{ $match: { _id: { $in: modifiedIdsArray } } },\n\t\t\t\t\t\t{ $addFields: { '_id': { _id: '$_id', __v: '$__v' } } },\n\t\t\t\t\t\t{ $project: { '__v': 0 } },\n\t\t\t\t\t\t{ $merge: {\n\t\t\t\t\t\t\tinto: this.versionCollection,\n\t\t\t\t\t\t\ton: '_id',\n\t\t\t\t\t\t\twhenMatched: 'fail',\n\t\t\t\t\t\t\twhenNotMatched: 'insert'\n\t\t\t\t\t\t}}\n\t\t\t\t\t])\n\t\t\t\t\t.toArray();\n\t\n\t\t\t\t// Delete old versions without loops\n\t\t\t\tconst oldVersions = await ResolveIOServer.getMainDB()\n\t\t\t\t\t.collection<T>(this.versionCollection)\n\t\t\t\t\t.aggregate([\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$match: {\n\t\t\t\t\t\t\t\t'_id._id': { $in: modifiedIdsArray }\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\t\t$sort: {\n\t\t\t\t\t\t\t\t'_id._id': 1,\n\t\t\t\t\t\t\t\t'_id.__v': -1\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\t\t$group: {\n\t\t\t\t\t\t\t\t_id: '$_id._id',\n\t\t\t\t\t\t\t\tdocs: { $push: '$_id' }\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\t\t$project: {\n\t\t\t\t\t\t\t\t_id: 0,\n\t\t\t\t\t\t\t\tdocsToDelete: {\n\t\t\t\t\t\t\t\t\t$slice: ['$docs', 5, { $size: '$docs' }]\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\t{ $unwind: '$docsToDelete' },\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$replaceRoot: { newRoot: '$docsToDelete' }\n\t\t\t\t\t\t}\n\t\t\t\t\t])\n\t\t\t\t\t.toArray();\n\t\n\t\t\t\tif (oldVersions.length > 0) {\n\t\t\t\t\tResolveIOServer.getMainDB()\n\t\t\t\t\t\t.collection<T>(this.versionCollection)\n\t\t\t\t\t\t.deleteMany(<any>{ _id: { $in: oldVersions } });\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// Perform logging if necessary\n\t\t\tif (!bypassLogs && logs.length) {\n\t\t\t\t// For logs with insertMany (updateMany, deleteMany), we need to expand them\n\t\t\t\tconst expandedLogs = [];\n\t\t\t\tfor (const log of logs) {\n\t\t\t\t\tif (log.insertOne) {\n\t\t\t\t\t\texpandedLogs.push(log);\n\t\t\t\t\t}\n\t\t\t\t\telse if (log.insertMany) {\n\t\t\t\t\t\tfor (const doc of log.insertMany) {\n\t\t\t\t\t\t\texpandedLogs.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: doc\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\t\t\t}\n\t\n\t\t\t\tif (expandedLogs.length) {\n\t\t\t\t\tLogs.bulkWrite(expandedLogs, { ordered: false });\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// Invalidate cache\n\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\n\t\t\treturn mainResult;\n\t\t}\n\t\tcatch (err) {\n\t\t\tconsole.error('Error in bulkWrite:', err);\n\t\t\tthrow err;\n\t\t}\n\t}\n\t\n\t// Helper function to extract field names from filters\n\tprivate extractFieldNames(filter: any, fieldNamesSet: Set<string>, prefix = '') {\n\t\tif (typeof filter !== 'object' || filter == null) {\n\t\t\treturn;\n\t\t}\n\t\n\t\tfor (const key in filter) {\n\t\t\tconst value = filter[key];\n\t\t\tif (key.startsWith('$')) {\n\t\t\t\t// Logical operator ($and, $or, etc.)\n\t\t\t\tif (Array.isArray(value)) {\n\t\t\t\t\tvalue.forEach(subFilter => this.extractFieldNames(subFilter, fieldNamesSet, prefix));\n\t\t\t\t}\n\t\t\t\telse if (typeof value === 'object') {\n\t\t\t\t\tthis.extractFieldNames(value, fieldNamesSet, prefix);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconst fullPath = prefix ? `${prefix}.${key}` : key;\n\t\t\t\tif (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n\t\t\t\t\t// May contain operators like $eq, $gt, etc.\n\t\t\t\t\tfieldNamesSet.add(fullPath);\n\t\t\t\t\tthis.extractFieldNames(value, fieldNamesSet, fullPath);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tfieldNamesSet.add(fullPath);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tcountDocuments(\n\t\tfilter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {},\n\t\toptions?: CountDocumentsOptions,\n\t\tskipCache = false\n\t): Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\ttry {\n\t\t\t\t// Check if the filter is empty\n\t\t\t\tconst isUnfiltered = Object.keys(filter).length === 0;\n\t\n\t\t\t\tif (isUnfiltered) {\n\t\t\t\t\t// Use collection stats for an unfiltered count\n\t\t\t\t\tconst res = await ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).estimatedDocumentCount(options);\n\t\t\t\t\tresolve(res);\n\t\t\t\t}\n\t\t\t\telse if (!skipCache) {\n\t\t\t\t\t// Use cached count if skipCache is false\n\t\t\t\t\tResolveIOServer.getMongoManager().countDocuments(this.collectionName, filter, options).then(\n\t\t\t\t\t\tres => resolve(res),\n\t\t\t\t\t\terr => reject(err)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// Fallback to direct countDocuments call with monitoring if skipCache is true\n\t\t\t\t\tlet monitor = new MonitorMongo('countDocuments', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).countDocuments(<any>filter, options).then(\n\t\t\t\t\t\tres => {\n\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\tresolve(res);\n\t\t\t\t\t\t},\n\t\t\t\t\t\terr => {\n\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\tconsole.log(new Date(), 'Error Count Documents', this.collectionName, filter, 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}\n\t\t\t} catch (err) {\n\t\t\t\tconsole.log(new Date(), 'Error Count Documents (Stats)', 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(async (resolve, reject) => {\n\t\t\ttry {\n\t\t\t\t// Check if index already exists based on the key\n\t\t\t\tconst dbCollection = ResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions);\n\t\t\t\tconst existingIndexes = await dbCollection.indexes();\n\t\n\t\t\t\t// Check if an index with the same key already exists\n\t\t\t\tconst indexExists = existingIndexes.some(index => \n\t\t\t\t\tJSON.stringify(index.key) === JSON.stringify(fieldOrSpec)\n\t\t\t\t);\n\t\n\t\t\t\tif (indexExists) {\n\t\t\t\t\treturn resolve('Index already exists'); // Skip creation if index exists\n\t\t\t\t}\n\t\n\t\t\t\t// If index doesn't exist, push it to the queue\n\t\t\t\tMongoManagerCollection.indexQueue.push({\n\t\t\t\t\taction: 'createIndex',\n\t\t\t\t\tcollection: this,\n\t\t\t\t\tspecs: [fieldOrSpec],\n\t\t\t\t\toptions: options\n\t\t\t\t}, (err, result) => {\n\t\t\t\t\tif (err) reject(err);\n\t\t\t\t\telse resolve(result);\n\t\t\t\t});\n\t\t\t} catch (err) {\n\t\t\t\treject(err);\n\t\t\t}\n\t\t});\n\t}\n\t\n\tcreateIndexes(indexSpecs: IndexDescription[], options?: CreateIndexesOptions): Promise<string[]> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\ttry {\n\t\t\t\tconst dbCollection = ResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions);\n\t\t\t\tconst existingIndexes = await dbCollection.indexes();\n\t\n\t\t\t\t// Filter out indexes that already exist based on the key\n\t\t\t\tconst indexesToCreate = indexSpecs.filter(indexSpec => \n\t\t\t\t\t!existingIndexes.some(existingIndex => \n\t\t\t\t\t\tJSON.stringify(existingIndex.key) === JSON.stringify(indexSpec.key)\n\t\t\t\t\t)\n\t\t\t\t);\n\t\n\t\t\t\t// If no new indexes to create, resolve early\n\t\t\t\tif (indexesToCreate.length === 0) {\n\t\t\t\t\treturn resolve(['All indexes already exist']);\n\t\t\t\t}\n\t\n\t\t\t\t// Push only new indexes to the queue\n\t\t\t\tMongoManagerCollection.indexQueue.push({\n\t\t\t\t\taction: 'createIndexes',\n\t\t\t\t\tcollection: this,\n\t\t\t\t\tspecs: [indexesToCreate],\n\t\t\t\t\toptions: options\n\t\t\t\t}, (err, result) => {\n\t\t\t\t\tif (err) reject(err);\n\t\t\t\t\telse resolve(result);\n\t\t\t\t});\n\t\t\t} catch (err) {\n\t\t\t\treject(err);\n\t\t\t}\n\t\t});\n\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","sift_1","MongoManager","serverConfig","this","_collections","_cacheMap","_operationInProgress","Map","_heapSize","getHeapStatistics","_serverCollections","_serverConfig","_isWorkersEnabled","_isWorkerInstance","_nodeCache","stdTTL","checkperiod","process","env","IS_WORKERS_ENABLED","IS_WORKER_INSTANCE","setCacheLimit","initServerCollections","setupChangeStream","prototype","_heapLimit","ResolveIOServer","getMainDB","listCollections","toArray","collections","_a","sent","getServerCollections","registerCollection","collection","_this","collectionOptions","timeseries","timeField","some","a","name","collectionName","type","dropCollection","then","createCollection","push","find","delay","ms","Promise","resolve","setTimeout","filter","options","cacheKey","generateCacheKey","undefined","result","getFromCache","has","get","promise","operation","executeFind","set","invalidatedDuringExecution","finally","delete","monitor","MonitorMongo","JSON","stringify","finish","addToCache","findOne","executeFindOne","aggregate","pipeline","__spreadArray","__read","flatMap","stage","$lookup","from","executeAggregate","countDocuments","executeCountDocuments","functionName","args","keyString","createHash","update","digest","cachedData","parse","dateReviver","error","del","data","getBinarySize","nodeCacheSize","getStats","vsize","deleteCount","keys","keys_1","__values","keys_1_1","next","done","key","value","console","log","invalidateQueryCache","collectionCacheMap","includes","collectionCacheMap_1","collectionCacheMap_1_1","cacheMap","changeStream","watch","$match","$and","ns.coll","$nin","$not","on","change","__awaiter","coll","err","Date","close","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","setInterval","getMainServer","getMongoManager","clearInterval","extractIndexNameFromError","errorMessage","matches","match","skipCache","reject","monitor_1","res","aggregateCount","aggregateCursor","cursor","ev","aggregateStream","streamOptions","stream","bulkWrite","operations","bypassLogs","bypassCheckSchema","bypassVersions","bulkOps","logs","modifiedIds","Set","additionalFilters","fieldNamesSet","BATCH_SIZE","opIndex","batchOps","slice","i","op","opType","Object","doc","document","objectIdHexString","__v","date","createdAt","updatedAt","validation","newContext","validate","Error","concat","validationErrors","insertOne","id_document","payload","method","id_user","user","messageId","route","add","$set","$inc","upsert","$setOnInsert","modifier","replacement","isSingle","extractFieldNames","isUpdateMany","insertMany","isDeleteMany","setImmediate","_h","combinedFilter","$or","map","item","projection_1","forEach","field","projection","docs","docs_1","docs_1_1","e_5","additionalFilters_1","additionalFilters_1_1","mainResult","size","modifiedIdsArray","Array","$in","$addFields","$project","$merge","into","whenMatched","whenNotMatched","$sort","$group","$push","docsToDelete","$slice","$size","$unwind","$replaceRoot","newRoot","oldVersions","deleteMany","expandedLogs","cnt","logs_1","logs_1_1","e_6","_b","_c","Logs","ordered","err_1","prefix","startsWith","isArray","subFilter","fullPath","estimatedDocumentCount","monitor_2","err_2","create","f_docs","fieldOrSpec","indexes","existingIndexes","index","indexQueue","action","specs","err_3","createIndexes","indexSpecs","existingIndexes_1","indexesToCreate","indexSpec","existingIndex","err_4","versionDoc","replaceOne","$lt","acknowledged","deletedCount","deleteOne","monitor_3","findOneAndDelete","returnVal","monitor_4","distinct","drop","dropIndex","indexName","dropIndexes","monitor_5","findById","id","findCount","count","findCursor","removeAllListeners","findStream","monitor_6","findOneAndReplace","getMethodManager","callMethodInternal","call","findOneAndUpdate","indexExists","bypassMonitor","validationResults","validDocs","idx","hasOwnProperty","monitor_7","listIndexes","rename","newName","monitor_8","modifiedCount","prevDoc","docId","docVersion","updatedDoc_1","getMongoMergeUpdatedDoc","monitor_9","monitor_10","returnDocument","monitor_11","monitor_12","updateMany","$unset","objectContainsPropertyDeep","updateOne","monitor_13","monitor_14","monitor_15","ok","monitor_16","watchCollection","queue","task","callback","dbCollection","apply","code","err_5","message","existingIndexName","innerError_1","_super","__extends","authenticate","password","attemptsInterval","Math","pow","attempts","calculatedInterval","last","now","getTime","Users","salt","pbkdf2","iterations","keylen","digestAlgorithm","hashBuffer","Buffer","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, ChangeStreamDocument } 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';\nimport sift from 'sift';\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: { collections: string[], key: string }[] = [];\n\tprivate _operationInProgress: Map<string, { promise: Promise<any>, invalidatedDuringExecution: boolean }> = new Map();\n\tprivate _heapSize = v8.getHeapStatistics() / numCPUs;\n\tprivate _heapLimit: number;\n\tprivate _serverCollections: (CollectionInfo | Pick<CollectionInfo, 'name' | 'type'>)[] = [];\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\t\tthis.setCacheLimit();\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\tthis._heapLimit = this._isWorkerInstance ? this._heapSize * 0.8 : this._heapSize * 0.4;\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\tprivate async delay(ms: number) {\n\t\treturn new Promise(resolve => setTimeout(resolve, ms));\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\tconst cacheKey = this.generateCacheKey([collectionName], 'find', [filter, options]);\n\t\tlet result = this.getFromCache(cacheKey);\n\t\tif (result !== undefined) {\n\t\t\treturn result;\n\t\t}\n\n\t\tif (this._operationInProgress.has(cacheKey)) {\n\t\t\treturn this._operationInProgress.get(cacheKey).promise;\n\t\t}\n\n\t\tconst operation = this.executeFind<T>(collectionName, filter, options, cacheKey);\n\t\tthis._operationInProgress.set(cacheKey, { promise: operation, invalidatedDuringExecution: false });\n\n\t\toperation.finally(() => this._operationInProgress.delete(cacheKey));\n\n\t\treturn operation;\n\t}\n\n\tprivate async executeFind<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> & MongoManagerFilterOperators<T>,\n\t\toptions: FindOptions<T> | undefined,\n\t\tcacheKey: string\n\t): Promise<T[]> {\n\t\tlet result;\n\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\n\t\tconst monitor = new MonitorMongo('find', collectionName, JSON.stringify([filter, options]));\n\t\tresult = await collection.find(<any>filter, options).toArray();\n\t\tmonitor.finish();\n\t\n\t\tif (!this._operationInProgress.get(cacheKey).invalidatedDuringExecution) {\n\t\t\tthis.addToCache([collectionName], cacheKey, result);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t// FindOne Operation\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\tconst cacheKey = this.generateCacheKey([collectionName], 'findOne', [filter, options]);\n\t\tlet result = this.getFromCache(cacheKey);\n\t\tif (result !== undefined) {\n\t\t\treturn result;\n\t\t}\n\n\t\tif (this._operationInProgress.has(cacheKey)) {\n\t\t\treturn this._operationInProgress.get(cacheKey).promise;\n\t\t}\n\n\t\tconst operation = this.executeFindOne<T>(collectionName, filter, options, cacheKey);\n\t\tthis._operationInProgress.set(cacheKey, { promise: operation, invalidatedDuringExecution: false });\n\n\t\toperation.finally(() => this._operationInProgress.delete(cacheKey));\n\n\t\treturn operation;\n\t}\n\n\tprivate async executeFindOne<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> | MongoManagerFilterOperators<T>,\n\t\toptions: FindOptions<T> | undefined,\n\t\tcacheKey: string\n\t): Promise<T> {\n\t\tlet result;\n\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\n\t\tconst monitor = new MonitorMongo('findOne', collectionName, JSON.stringify([filter, options]));\n\t\tresult = await collection.findOne(<any>filter, options);\n\t\tmonitor.finish();\n\t\n\t\tif (!this._operationInProgress.get(cacheKey).invalidatedDuringExecution) {\n\t\t\tthis.addToCache([collectionName], cacheKey, result);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t// Aggregate Operation\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\tconst collections = [collectionName, ...pipeline.flatMap(stage => stage.$lookup?.from ? [stage.$lookup.from] : [])];\n\t\tconst cacheKey = this.generateCacheKey(collections, 'aggregate', [pipeline, options]);\n\t\tlet result = this.getFromCache(cacheKey);\n\t\tif (result !== undefined) {\n\t\t\treturn result;\n\t\t}\n\n\t\tif (this._operationInProgress.has(cacheKey)) {\n\t\t\treturn this._operationInProgress.get(cacheKey).promise;\n\t\t}\n\n\t\tconst operation = this.executeAggregate<T>(collectionName, pipeline, options, cacheKey, collections);\n\t\tthis._operationInProgress.set(cacheKey, { promise: operation, invalidatedDuringExecution: false });\n\n\t\toperation.finally(() => this._operationInProgress.delete(cacheKey));\n\n\t\treturn operation;\n\t}\n\n\tprivate async executeAggregate<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tpipeline: any[],\n\t\toptions: AggregateOptions | undefined,\n\t\tcacheKey: string,\n\t\tcollections: string[]\n\t): Promise<any[]> {\n\t\tlet result;\n\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\n\t\tconst monitor = new MonitorMongo('aggregate', collectionName, JSON.stringify([pipeline, options]));\n\t\tresult = await collection.aggregate(pipeline, options).toArray();\n\t\tmonitor.finish();\n\n\t\tif (!this._operationInProgress.get(cacheKey).invalidatedDuringExecution) {\n\t\t\tthis.addToCache(collections, cacheKey, result);\n\t\t}\n\t\t\n\t\treturn result;\n\t}\n\n\tpublic async countDocuments<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> | MongoManagerFilterOperators<T> = {},\n\t\toptions?: CountDocumentsOptions\n\t): Promise<number> {\n\t\tconst cacheKey = this.generateCacheKey([collectionName], 'countDocuments', [filter, options]);\n\t\tlet result = this.getFromCache(cacheKey);\n\t\tif (result !== undefined) {\n\t\t\treturn result;\n\t\t}\n\n\t\tif (this._operationInProgress.has(cacheKey)) {\n\t\t\treturn this._operationInProgress.get(cacheKey).promise;\n\t\t}\n\n\t\tconst operation = this.executeCountDocuments<T>(collectionName, filter, options, cacheKey);\n\t\tthis._operationInProgress.set(cacheKey, { promise: operation, invalidatedDuringExecution: false });\n\n\t\toperation.finally(() => this._operationInProgress.delete(cacheKey));\n\n\t\treturn operation;\n\t}\n\n\tprivate async executeCountDocuments<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> | MongoManagerFilterOperators<T>,\n\t\toptions: CountDocumentsOptions,\n\t\tcacheKey: string\n\t): Promise<number> {\n\t\tlet result;\n\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\n\t\tconst monitor = new MonitorMongo('countDocuments', collectionName, JSON.stringify([filter, options]));\n\t\tresult = await collection.countDocuments(<any>filter, options);\n\t\tmonitor.finish();\n\t\n\t\tif (!this._operationInProgress.get(cacheKey).invalidatedDuringExecution) {\n\t\t\tthis.addToCache([collectionName], cacheKey, result);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t// Cache and Invalidation Setup\n\tprivate generateCacheKey(collections: string[], functionName: string, args: any[]): string {\n\t\tconst keyString = JSON.stringify({ collections, 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\tthis._nodeCache.del(cacheKey);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate addToCache(collections: 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\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\t\t\t\n\t\t\tthis._nodeCache.set(cacheKey, JSON.stringify(data));\n\t\t\tthis._cacheMap.push({ collections, key: cacheKey });\n\t\t}\n\t}\n\n\tpublic invalidateQueryCache(collection: string) {\n\t\tconst collectionCacheMap = this._cacheMap.filter(a => a.collections.includes(collection));\n\n\t\tfor (const cacheMap of collectionCacheMap) {\n\t\t\tthis._nodeCache.del(cacheMap.key);\n\t\t\t\n\t\t\tif (this._operationInProgress.has(cacheMap.key)) {\n\t\t\t\tthis._operationInProgress.get(cacheMap.key).invalidatedDuringExecution = true;\n\t\t\t}\n\t\t}\n\n\t\tthis._cacheMap = this._cacheMap.filter(a => !a.collections.includes(collection));\n\t}\n\n\tprivate setupChangeStream() {\n\t\tconst db = ResolveIOServer.getMainDB();\n\n\t\tconst pipeline = [\n\t\t\t{\n\t\t\t\t$match: {\n\t\t\t\t\t$and: [\n\t\t\t\t\t\t{'ns.coll': { $nin: ['logs', 'log-method-latencies', 'log-subscriptions'] }},\n\t\t\t\t\t\t{'ns.coll': { $not: /.*\\.versions$/ }},\n\t\t\t\t\t\t{'ns.coll': { $not: /^monitor-/ }},\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t\tconst changeStream = db.watch(pipeline);\n\n\t\tchangeStream.on('change', async (change: ChangeStreamDocument) => {\n\t\t\tif (change['ns'] && change['ns'].coll) {\n\t\t\t\tconst collectionName = change['ns'].coll;\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);\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);\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\t\tconst { action, collection, specs, options } = task;\n\t\tconst dbCollection = ResolveIOServer.getMainDB().collection(collection.collectionName, collection.collectionOptions);\n\t\n\t\tif (!dbCollection) {\n\t\t\treturn callback(new Error(`Collection ${collection.collectionName} not found`));\n\t\t}\n\t\n\t\tlet monitor = new MonitorMongo(action, collection.collectionName, JSON.stringify([specs, options]));\n\t\n\t\ttry {\n\t\t\t// Try creating the index, will auto-skip if already checked in createIndex/createIndexes\n\t\t\tconst result = await dbCollection[action](...specs, options);\n\t\t\tmonitor.finish();\n\t\t\tcallback(null, result);\n\t\t} catch (err) {\n\t\t\t// Handle any specific errors related to index creation\n\t\t\tif (err.code === 85 || err.message.includes('IndexOptionsConflict')) {\n\t\t\t\ttry {\n\t\t\t\t\tconst existingIndexName = collection.extractIndexNameFromError(err.message);\n\t\t\t\t\tif (existingIndexName) {\n\t\t\t\t\t\tawait dbCollection.dropIndex(existingIndexName);\n\t\t\t\t\t\tconst result = await dbCollection[action](...specs, options);\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tcallback(null, result);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t} catch (innerError) {\n\t\t\t\t\tcallback(innerError);\n\t\t\t\t}\n\t\t\t}\n\t\t\tmonitor.finish();\n\t\t\tcallback(err);\n\t\t}\n\t}, 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\tasync bulkWrite(\n\t\toperations: any[],\n\t\toptions?: BulkWriteOptions,\n\t\tbypassLogs = false,\n\t\tbypassCheckSchema = false,\n\t\tbypassVersions = false\n\t): Promise<BulkWriteResult> {\n\t\tif (!operations.length) {\n\t\t\treturn null;\n\t\t}\n\t\n\t\tconst bulkOps = [];\n\t\tconst logs = [];\n\t\tconst modifiedIds = new Set<string>();\n\t\n\t\tconst additionalFilters = [];\n\t\tconst fieldNamesSet = new Set<string>();\n\n\t\tconst BATCH_SIZE = 1000;\n\n\t\tlet opIndex = 0;\n\n \t\twhile (opIndex < operations.length) {\n\t\t\tconst batchOps = operations.slice(opIndex, opIndex + BATCH_SIZE);\n\n\t\t\tfor (let i = 0; i < batchOps.length; i++) {\n\t\t\t\tconst op = batchOps[i];\n\t\t\t\tconst opType = Object.keys(op)[0];\n\t\t\t\tconst doc = op[opType];\n\t\t\n\t\t\t\tif (opType === 'insertOne') {\n\t\t\t\t\t// Handle insertOne\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\t\t\t\tif (this.useVersions && doc.document.__v === undefined) {\n\t\t\t\t\t\tdoc.document.__v = 0;\n\t\t\t\t\t}\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tconst date = new Date();\n\t\t\t\t\t\tdoc.document.createdAt = doc.document.createdAt || date;\n\t\t\t\t\t\tdoc.document.updatedAt = doc.document.updatedAt || date;\n\t\t\t\t\t}\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\tif (!validation.validate(doc.document)) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`Schema validation failed for insertOne: ${JSON.stringify(validation.validationErrors())}`\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\tbulkOps.push(op);\n\t\t\n\t\t\t\t\t// Collect logs if necessary\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:\n\t\t\t\t\t\t\t\t\t\tgetBinarySize(JSON.stringify([op, options])) < 200000\n\t\t\t\t\t\t\t\t\t\t\t? JSON.stringify([op, options], null, 2)\n\t\t\t\t\t\t\t\t\t\t\t: '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\t\n\t\t\t\t\t// Track inserted IDs for versioning\n\t\t\t\t\tif (!bypassVersions && this.useVersions) {\n\t\t\t\t\t\tmodifiedIds.add(doc.document._id);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (opType === 'updateOne' || opType === 'replaceOne') {\n\t\t\t\t\t// Handle updateOne and replaceOne\n\t\t\t\t\tif (opType === 'updateOne') {\n\t\t\t\t\t\tif (!doc.update.$set) doc.update.$set = {};\n\t\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\t\tdoc.update.$set.updatedAt = new Date();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\tif (!doc.update.$inc) doc.update.$inc = {};\n\t\t\t\t\t\t\tdoc.update.$inc.__v = 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (doc.upsert) {\n\t\t\t\t\t\t\tif (!doc.update.$setOnInsert) doc.update.$setOnInsert = {};\n\t\t\t\t\t\t\tif (!doc.update.$setOnInsert._id) doc.update.$setOnInsert._id = objectIdHexString();\n\t\t\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\t\t\tdoc.update.$setOnInsert.createdAt = new Date();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\t\tdoc.update.$setOnInsert.__v = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\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\tif (!validation.validate(doc.update, { modifier: true })) {\n\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t`Schema validation failed for updateOne: ${JSON.stringify(validation.validationErrors())}`\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\t\t\t\telse if (opType === 'replaceOne') {\n\t\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\t\tdoc.replacement.updatedAt = new Date();\n\t\t\t\t\t\t\tif (doc.upsert && !doc.replacement.createdAt) {\n\t\t\t\t\t\t\t\tdoc.replacement.createdAt = new Date();\n\t\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\tdoc.replacement.__v = doc.replacement.__v !== undefined ? doc.replacement.__v + 1 : 0;\n\t\t\t\t\t\t}\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\tif (!validation.validate(doc.replacement)) {\n\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t`Schema validation failed for replaceOne: ${JSON.stringify(validation.validationErrors())}`\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\t\t\t\tbulkOps.push(op);\n\t\t\n\t\t\t\t\t// Collect logs if necessary\n\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\tlet id_document = '';\n\t\t\t\t\t\tif (doc.filter && doc.filter._id) {\n\t\t\t\t\t\t\tid_document = doc.filter._id;\n\t\t\t\t\t\t\t// Track modified IDs for versioning\n\t\t\t\t\t\t\tif (!bypassVersions && this.useVersions) {\n\t\t\t\t\t\t\t\tmodifiedIds.add(doc.filter._id);\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\t// Collect filters for additional querying\n\t\t\t\t\t\t\tadditionalFilters.push({ filter: doc.filter, opIndex: logs.length, isSingle: true });\n\t\t\t\t\t\t\t// Extract field names from filter\n\t\t\t\t\t\t\tthis.extractFieldNames(doc.filter, fieldNamesSet);\n\t\t\t\t\t\t}\n\t\t\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: id_document,\n\t\t\t\t\t\t\t\t\tpayload:\n\t\t\t\t\t\t\t\t\t\tgetBinarySize(JSON.stringify([op, options])) < 200000\n\t\t\t\t\t\t\t\t\t\t\t? JSON.stringify([op, options], null, 2)\n\t\t\t\t\t\t\t\t\t\t\t: '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\t\t\t\telse {\n\t\t\t\t\t\t// Even if not logging, we need to track modified IDs for versioning\n\t\t\t\t\t\tif (!bypassVersions && doc.filter && doc.filter._id && this.useVersions) {\n\t\t\t\t\t\t\tmodifiedIds.add(doc.filter._id);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (!bypassVersions && this.useVersions) {\n\t\t\t\t\t\t\t// Need to collect filters to fetch _id later\n\t\t\t\t\t\t\tadditionalFilters.push({ filter: doc.filter, opIndex: null, isSingle: true });\n\t\t\t\t\t\t\tthis.extractFieldNames(doc.filter, fieldNamesSet);\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 === 'updateMany') {\n\t\t\t\t\t// Handle updateMany\n\t\t\t\t\tif (!doc.update.$set) doc.update.$set = {};\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tdoc.update.$set.updatedAt = new Date();\n\t\t\t\t\t}\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tif (!doc.update.$inc) doc.update.$inc = {};\n\t\t\t\t\t\tdoc.update.$inc.__v = 1;\n\t\t\t\t\t}\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\tif (!validation.validate(doc.update, { modifier: true })) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`Schema validation failed for updateMany: ${JSON.stringify(validation.validationErrors())}`\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\tbulkOps.push(op);\n\t\t\n\t\t\t\t\t// Collect logs if necessary\n\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t// We need to fetch the affected documents to get their _id\n\t\t\t\t\t\tadditionalFilters.push({ filter: doc.filter, opIndex: logs.length, isUpdateMany: true });\n\t\t\t\t\t\t// Extract field names from filter\n\t\t\t\t\t\tthis.extractFieldNames(doc.filter, fieldNamesSet);\n\t\t\n\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\tinsertMany: [] // We will populate this after fetching documents\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (!bypassVersions && this.useVersions) {\n\t\t\t\t\t\t// Need to collect filters to fetch _id for versioning\n\t\t\t\t\t\tadditionalFilters.push({ filter: doc.filter, opIndex: null, isUpdateMany: true });\n\t\t\t\t\t\tthis.extractFieldNames(doc.filter, fieldNamesSet);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (opType === 'deleteOne' || opType === 'deleteMany') {\n\t\t\t\t\t// Handle deleteOne and deleteMany\n\t\t\t\t\tbulkOps.push(op);\n\t\t\n\t\t\t\t\t// Collect logs if necessary\n\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\tlet id_document = '';\n\t\t\t\t\t\tif (doc.filter && doc.filter._id) {\n\t\t\t\t\t\t\tid_document = doc.filter._id;\n\t\t\t\t\t\t\t// Track modified IDs for versioning\n\t\t\t\t\t\t\tif (!bypassVersions && this.useVersions) {\n\t\t\t\t\t\t\t\tmodifiedIds.add(doc.filter._id);\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\t// Collect filters for additional querying\n\t\t\t\t\t\t\tadditionalFilters.push({ filter: doc.filter, opIndex: logs.length, isDeleteMany: opType === 'deleteMany' });\n\t\t\t\t\t\t\t// Extract field names from filter\n\t\t\t\t\t\t\tthis.extractFieldNames(doc.filter, fieldNamesSet);\n\t\t\t\t\t\t}\n\t\t\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: id_document,\n\t\t\t\t\t\t\t\t\tpayload:\n\t\t\t\t\t\t\t\t\t\tgetBinarySize(JSON.stringify([op, options])) < 200000\n\t\t\t\t\t\t\t\t\t\t\t? JSON.stringify([op, options], null, 2)\n\t\t\t\t\t\t\t\t\t\t\t: '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\t\t\t\tif (!bypassVersions && this.useVersions) {\n\t\t\t\t\t\tif (doc.filter && doc.filter._id) {\n\t\t\t\t\t\t\tmodifiedIds.add(doc.filter._id);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t// Need to collect filters to fetch _id for versioning\n\t\t\t\t\t\t\tadditionalFilters.push({ filter: doc.filter, opIndex: null, isDeleteMany: opType === 'deleteMany' });\n\t\t\t\t\t\t\tthis.extractFieldNames(doc.filter, fieldNamesSet);\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\tthrow new Error(`Unsupported operation type: ${opType}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\topIndex += BATCH_SIZE;\n\n\t\t\t// Pause execution to allow the event loop to process other events\n\t\t\tawait new Promise((resolve) => setImmediate(resolve));\n\t\t}\n\t\n\t\ttry {\n\t\t\t// Fetch necessary fields for logs and versioning where required\n\t\t\tif (!bypassVersions && additionalFilters.length) {\n\t\t\t\t// Combine all filters into one query using $or\n\t\t\t\tconst combinedFilter = {\n\t\t\t\t\t$or: additionalFilters.map(item => item.filter)\n\t\t\t\t};\n\t\n\t\t\t\t// Build the projection object with necessary fields\n\t\t\t\tconst projection: any = { _id: 1 };\n\t\t\t\tfieldNamesSet.forEach(field => {\n\t\t\t\t\tprojection[field] = 1;\n\t\t\t\t});\n\t\n\t\t\t\t// Fetch matching documents with necessary fields\n\t\t\t\tconst cursor = ResolveIOServer.getMainDB()\n\t\t\t\t\t.collection<T>(this.collectionName)\n\t\t\t\t\t.find(combinedFilter, { projection });\n\t\n\t\t\t\tconst docs = await cursor.toArray();\n\t\n\t\t\t\t// Map documents to their filters\n\t\t\t\tfor (const doc of docs) {\n\t\t\t\t\t// For each filter, check if it matches this document\n\t\t\t\t\tfor (const item of additionalFilters) {\n\t\t\t\t\t\tif (sift(item.filter)(doc)) {\n\t\t\t\t\t\t\tif (item.opIndex !== null) {\n\t\t\t\t\t\t\t\t// For logs\n\t\t\t\t\t\t\t\tif (item.isUpdateMany || item.isDeleteMany) {\n\t\t\t\t\t\t\t\t\t// For updateMany and deleteMany, we collect multiple documents\n\t\t\t\t\t\t\t\t\tif (!logs[item.opIndex].insertMany) {\n\t\t\t\t\t\t\t\t\t\tlogs[item.opIndex].insertMany = [];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tlogs[item.opIndex].insertMany.push({\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: doc._id,\n\t\t\t\t\t\t\t\t\t\tpayload:\n\t\t\t\t\t\t\t\t\t\t\tgetBinarySize(JSON.stringify([operations[item.opIndex], options])) < 200000\n\t\t\t\t\t\t\t\t\t\t\t\t? JSON.stringify([operations[item.opIndex], options], null, 2)\n\t\t\t\t\t\t\t\t\t\t\t\t: 'Too Big',\n\t\t\t\t\t\t\t\t\t\tmethod: operations[item.opIndex] ? Object.keys(operations[item.opIndex])[0] : '',\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\telse if (item.isSingle) {\n\t\t\t\t\t\t\t\t\t// For updateOne and deleteOne without _id in filter\n\t\t\t\t\t\t\t\t\tlogs[item.opIndex].insertOne.document.id_document = doc._id;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// For versioning\n\t\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\t\tmodifiedIds.add(<string>doc._id);\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\t\n\t\t\t// Perform the bulkWrite operations\n\t\t\tconst mainResult = await ResolveIOServer.getMainDB()\n\t\t\t\t.collection<T>(this.collectionName)\n\t\t\t\t.bulkWrite(bulkOps, options);\n\t\n\t\t\t// Versioning using aggregation pipeline\n\t\t\tif (!bypassVersions && this.useVersions && modifiedIds.size > 0) {\n\t\t\t\tconst modifiedIdsArray = Array.from(modifiedIds);\n\t\n\t\t\t\t// Create versions using aggregation\n\t\t\t\tResolveIOServer.getMainDB()\n\t\t\t\t\t.collection<T>(this.collectionName)\n\t\t\t\t\t.aggregate([\n\t\t\t\t\t\t{ $match: { _id: { $in: modifiedIdsArray } } },\n\t\t\t\t\t\t{ $addFields: { '_id': { _id: '$_id', __v: '$__v' } } },\n\t\t\t\t\t\t{ $project: { '__v': 0 } },\n\t\t\t\t\t\t{ $merge: {\n\t\t\t\t\t\t\tinto: this.versionCollection,\n\t\t\t\t\t\t\ton: '_id',\n\t\t\t\t\t\t\twhenMatched: 'fail',\n\t\t\t\t\t\t\twhenNotMatched: 'insert'\n\t\t\t\t\t\t}}\n\t\t\t\t\t])\n\t\t\t\t\t.toArray();\n\t\n\t\t\t\t// Delete old versions without loops\n\t\t\t\tconst oldVersions = await ResolveIOServer.getMainDB()\n\t\t\t\t\t.collection<T>(this.versionCollection)\n\t\t\t\t\t.aggregate([\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$match: {\n\t\t\t\t\t\t\t\t'_id._id': { $in: modifiedIdsArray }\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\t\t$sort: {\n\t\t\t\t\t\t\t\t'_id._id': 1,\n\t\t\t\t\t\t\t\t'_id.__v': -1\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\t\t$group: {\n\t\t\t\t\t\t\t\t_id: '$_id._id',\n\t\t\t\t\t\t\t\tdocs: { $push: '$_id' }\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\t\t$project: {\n\t\t\t\t\t\t\t\t_id: 0,\n\t\t\t\t\t\t\t\tdocsToDelete: {\n\t\t\t\t\t\t\t\t\t$slice: ['$docs', 5, { $size: '$docs' }]\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\t{ $unwind: '$docsToDelete' },\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$replaceRoot: { newRoot: '$docsToDelete' }\n\t\t\t\t\t\t}\n\t\t\t\t\t])\n\t\t\t\t\t.toArray();\n\t\n\t\t\t\tif (oldVersions.length > 0) {\n\t\t\t\t\tResolveIOServer.getMainDB()\n\t\t\t\t\t\t.collection<T>(this.versionCollection)\n\t\t\t\t\t\t.deleteMany(<any>{ _id: { $in: oldVersions } });\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// Perform logging if necessary\n\t\t\tif (!bypassLogs && logs.length) {\n\t\t\t\t// For logs with insertMany (updateMany, deleteMany), we need to expand them\n\t\t\t\tconst expandedLogs = [];\n\t\t\t\tlet cnt = 1;\n\t\t\t\tfor (const log of logs) {\n\t\t\t\t\tif (log.insertOne) {\n\t\t\t\t\t\texpandedLogs.push(log);\n\t\t\t\t\t}\n\t\t\t\t\telse if (log.insertMany) {\n\t\t\t\t\t\tfor (const doc of log.insertMany) {\n\t\t\t\t\t\t\texpandedLogs.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: doc\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\n\t\t\t\t\tif (cnt % 1000 === 0) { \n\t\t\t\t\t\t// Pause execution to allow the event loop to process other events\n\t\t\t\t\t\tawait new Promise((resolve) => setImmediate(resolve));\n\t\t\t\t\t}\n\n\t\t\t\t\tcnt += 1;\n\t\t\t\t}\n\t\n\t\t\t\tif (expandedLogs.length) {\n\t\t\t\t\tLogs.bulkWrite(expandedLogs, { ordered: false });\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// Invalidate cache\n\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\n\t\t\treturn mainResult;\n\t\t}\n\t\tcatch (err) {\n\t\t\tconsole.error('Error in bulkWrite:', err);\n\t\t\tthrow err;\n\t\t}\n\t}\n\t\n\t// Helper function to extract field names from filters\n\tprivate extractFieldNames(filter: any, fieldNamesSet: Set<string>, prefix = '') {\n\t\tif (typeof filter !== 'object' || filter == null) {\n\t\t\treturn;\n\t\t}\n\t\n\t\tfor (const key in filter) {\n\t\t\tconst value = filter[key];\n\t\t\tif (key.startsWith('$')) {\n\t\t\t\t// Logical operator ($and, $or, etc.)\n\t\t\t\tif (Array.isArray(value)) {\n\t\t\t\t\tvalue.forEach(subFilter => this.extractFieldNames(subFilter, fieldNamesSet, prefix));\n\t\t\t\t}\n\t\t\t\telse if (typeof value === 'object') {\n\t\t\t\t\tthis.extractFieldNames(value, fieldNamesSet, prefix);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconst fullPath = prefix ? `${prefix}.${key}` : key;\n\t\t\t\tif (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n\t\t\t\t\t// May contain operators like $eq, $gt, etc.\n\t\t\t\t\tfieldNamesSet.add(fullPath);\n\t\t\t\t\tthis.extractFieldNames(value, fieldNamesSet, fullPath);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tfieldNamesSet.add(fullPath);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tcountDocuments(\n\t\tfilter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {},\n\t\toptions?: CountDocumentsOptions,\n\t\tskipCache = false\n\t): Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\ttry {\n\t\t\t\t// Check if the filter is empty\n\t\t\t\tconst isUnfiltered = Object.keys(filter).length === 0;\n\t\n\t\t\t\tif (isUnfiltered) {\n\t\t\t\t\t// Use collection stats for an unfiltered count\n\t\t\t\t\tconst res = await ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).estimatedDocumentCount(options);\n\t\t\t\t\tresolve(res);\n\t\t\t\t}\n\t\t\t\telse if (!skipCache) {\n\t\t\t\t\t// Use cached count if skipCache is false\n\t\t\t\t\tResolveIOServer.getMongoManager().countDocuments(this.collectionName, filter, options).then(\n\t\t\t\t\t\tres => resolve(res),\n\t\t\t\t\t\terr => reject(err)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// Fallback to direct countDocuments call with monitoring if skipCache is true\n\t\t\t\t\tlet monitor = new MonitorMongo('countDocuments', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).countDocuments(<any>filter, options).then(\n\t\t\t\t\t\tres => {\n\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\tresolve(res);\n\t\t\t\t\t\t},\n\t\t\t\t\t\terr => {\n\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\tconsole.log(new Date(), 'Error Count Documents', this.collectionName, filter, 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}\n\t\t\t} catch (err) {\n\t\t\t\tconsole.log(new Date(), 'Error Count Documents (Stats)', 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(async (resolve, reject) => {\n\t\t\ttry {\n\t\t\t\t// Check if index already exists based on the key\n\t\t\t\tconst dbCollection = ResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions);\n\t\t\t\tconst existingIndexes = await dbCollection.indexes();\n\t\n\t\t\t\t// Check if an index with the same key already exists\n\t\t\t\tconst indexExists = existingIndexes.some(index => \n\t\t\t\t\tJSON.stringify(index.key) === JSON.stringify(fieldOrSpec)\n\t\t\t\t);\n\t\n\t\t\t\tif (indexExists) {\n\t\t\t\t\treturn resolve('Index already exists'); // Skip creation if index exists\n\t\t\t\t}\n\t\n\t\t\t\t// If index doesn't exist, push it to the queue\n\t\t\t\tMongoManagerCollection.indexQueue.push({\n\t\t\t\t\taction: 'createIndex',\n\t\t\t\t\tcollection: this,\n\t\t\t\t\tspecs: [fieldOrSpec],\n\t\t\t\t\toptions: options\n\t\t\t\t}, (err, result) => {\n\t\t\t\t\tif (err) reject(err);\n\t\t\t\t\telse resolve(result);\n\t\t\t\t});\n\t\t\t} catch (err) {\n\t\t\t\treject(err);\n\t\t\t}\n\t\t});\n\t}\n\t\n\tcreateIndexes(indexSpecs: IndexDescription[], options?: CreateIndexesOptions): Promise<string[]> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\ttry {\n\t\t\t\tconst dbCollection = ResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions);\n\t\t\t\tconst existingIndexes = await dbCollection.indexes();\n\t\n\t\t\t\t// Filter out indexes that already exist based on the key\n\t\t\t\tconst indexesToCreate = indexSpecs.filter(indexSpec => \n\t\t\t\t\t!existingIndexes.some(existingIndex => \n\t\t\t\t\t\tJSON.stringify(existingIndex.key) === JSON.stringify(indexSpec.key)\n\t\t\t\t\t)\n\t\t\t\t);\n\t\n\t\t\t\t// If no new indexes to create, resolve early\n\t\t\t\tif (indexesToCreate.length === 0) {\n\t\t\t\t\treturn resolve(['All indexes already exist']);\n\t\t\t\t}\n\t\n\t\t\t\t// Push only new indexes to the queue\n\t\t\t\tMongoManagerCollection.indexQueue.push({\n\t\t\t\t\taction: 'createIndexes',\n\t\t\t\t\tcollection: this,\n\t\t\t\t\tspecs: [indexesToCreate],\n\t\t\t\t\toptions: options\n\t\t\t\t}, (err, result) => {\n\t\t\t\t\tif (err) reject(err);\n\t\t\t\t\telse resolve(result);\n\t\t\t\t});\n\t\t\t} catch (err) {\n\t\t\t\treject(err);\n\t\t\t}\n\t\t});\n\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}"]}