@resolveio/server-lib 20.4.12 → 20.4.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/managers/mongo.manager.ts"],"names":["simpl_schema_1","require","mongodb_1","index_1","user_collection_1","common_1","log_collection_1","NodeCache","crypto","scmp","monitor_manager_1","os_1","numCPUs","cpus","length","v8","async_1","MongoManager","serverConfig","_this","this","_collections","_cacheMap","_heapSize","getHeapStatistics","_serverCollections","_debugRemoveCacheHits","_debugMongoQueueCollections","_serverConfig","_isWorkersEnabled","_isWorkerInstance","_nodeCache","stdTTL","checkperiod","process","env","IS_WORKERS_ENABLED","IS_WORKER_INSTANCE","setCacheLimit","setInterval","ResolveIOServer","getMainServer","getSubscriptionManager","getEnableDebug","console","log","Date","JSON","stringify","initServerCollections","setupChangeStream","prototype","_heapLimit","getMainDB","listCollections","toArray","collections","_a","sent","getServerCollections","registerCollection","collection","collectionOptions","timeseries","timeField","some","a","name","collectionName","type","dropCollection","then","createCollection","push","find","filter","options","cacheKey","generateCacheKey","undefined","result","getFromCache","monitor","MonitorMongo","finish","addToCache","error","error_1","findOne","error_2","aggregate","pipeline","_i","pipeline_1","stage","$lookup","from","includes","error_3","functionName","args","keyString","createHash","update","digest","cachedData","get","parse","dateReviver","del","data","Array","isArray","getBinarySize","nodeCacheSize","getStats","vsize","deleteCount","keys_1","keys","key","set","invalidateQueryCache","collectionCacheMap_1","cacheMap","changeStream","getMongoConnection","db","watch","on","change","__awaiter","coll","err","close","setTimeout","MongoManagerModel","exports","versionOptions","collection_main","collection_version","MongoManagerUserCollection","MongoManagerCollection","useVersionCollection","useVersions","versionSchema","deepCopy","schema","_id","blackbox","useReportBuilder","reportBuilderLookupTables","timestamps","createLogs","checkSchema","createIndex","_id._id","_id.__v","versionCollection","schemaCopy","interval","simplschema","rbSchema","useRB","default","buildRbLookups","buildRbSchema","getMongoManager","clearInterval","extractIndexNameFromError","errorMessage","matches","match","skipCache","Promise","resolve","reject","monitor_1","res","aggregateCount","aggregateCursor","cursor","ev","aggregateStream","streamOptions","stream","bulkWrite","operations","bypassLogs","bypassCheckSchema","logs","versionOps","deleteOldVersionsOps","bulkOps","updateFilters","updateManyFilters","deleteManyFilters","forEach","op","opType","Object","$or","__spreadArray","_b","_c","currentDocs","getNestedValue","doc","split","reduce","acc","part","map","item","val","findMatchingDocs","matchDocument","every","value","docValue","subFilter","evaluateCondition","condition","$in","$nin","$ne","$gt","$gte","$lt","$lte","$exists","RegExp","$regex","$options","test","date","document","objectIdHexString","this_1","hasOwnProperty","__v","createdAt","updatedAt","validation","newContext","validate","validationErrors","getMethodManager","callMethodInternal","call","insertOne","id_document","payload","method","id_user","user","messageId","route","matchingDocs","_d","matchingDocs_1","currentDoc","$set","modifier","versionDoc","objectContainsPropertyDeep","$inc","deleteMany","upsert","$setOnInsert","replacement","_e","matchingDocs_2","_f","matchingDocs_3","operations_1","slice","mainResult","Logs","err_1","countDocuments","create","f_docs","insertMany","fieldOrSpec","indexQueue","action","specs","createIndexes","indexSpecs","docs","i","replaceOne","$and","acknowledged","deletedCount","deleteOne","monitor_2","findOneAndDelete","returnVal","monitor_3","distinct","drop","dropIndex","indexName","dropIndexes","monitor_4","findById","id","findCount","count","findCursor","removeAllListeners","findStream","monitor_5","findOneAndReplace","findOneAndUpdate","indexes","indexExists","bypassMonitor","validationResults","validDocs","idx","monitor_6","listIndexes","rename","newName","monitor_7","modifiedCount","prevDoc","docId","docVersion","updatedDoc_1","getMongoMergeUpdatedDoc","monitor_8","monitor_9","returnDocument","monitor_10","monitor_11","updateMany","bypassVersions","$unset","updateOne","monitor_12","monitor_13","monitor_14","ok","monitor_15","watchCollection","queue","task","callback","dbCollection","apply","code","err_2","message","existingIndexName","innerError_1","Error","concat","_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 } from 'mongodb';\nimport { LookupTables } from '../models/report-builder.model';\nimport { ResolveIOServer } from '../index';\nimport { Users } from '../collections/user.collection';\nimport { buildRbLookups, buildRbSchema, dateReviver, deepCopy, getBinarySize, getMongoMergeUpdatedDoc } from '../util/common';\nimport { UserModel } from '../models/user.model';\nimport { Logs } from '../collections/log.collection';\nimport * as NodeCache from 'node-cache';\nconst crypto = require('crypto');\nconst scmp = require('scmp');\nimport { MonitorMongo } from './monitor.manager';\nimport { CollectionDocument, Document } from '../models/collection-document.model';\nimport { cpus } from 'os';\nconst numCPUs = cpus().length;\nconst v8 = require('v8');\nimport async from 'async';\n\ninterface MongoQueueModel {\n\t_id: number,\n\tname_collection: string;\n\tlookup_collections: string[];\n\tname_function: string;\n\tdata_function: any[];\n\tname_function_addt: string;\n\tdata_function_addt: any[];\n\tcbs: Function[];\n\tcbs_next: Function[];\n\trunning: boolean;\n\tcacheId: number;\n\tinvalidateFlag: boolean;\n\tinvalidateCount: number;\n}\n\n// export declare interface MongoManagerFilterOperators<T> extends Document {\nexport declare interface MongoManagerFilterParamaterOperators<P> {\n\t$eq?: P;\n $gt?: P;\n $gte?: P;\n $in?: P extends Array<any> ? P : P[];\n $lt?: P;\n $lte?: P;\n $ne?: P;\n $nin?: P extends Array<any> ? P : P[];\n $not?: P extends string ? MongoManagerFilterParamaterOperators<P> | RegExpConstructor : MongoManagerFilterParamaterOperators<P>;\n $exists?: boolean;\n $expr?: any[]\n $regex?: P extends string ? RegExpConstructor | string : never;\n $options?: P extends string ? string : never;\n $geoIntersects?: {\n $geometry: Document;\n };\n $geoWithin?: Document;\n $near?: Document;\n $nearSphere?: Document;\n $maxDistance?: number;\n $all?: any[];\n $elemMatch?: Document;\n $size?: P extends any[] ? number : never;\n}\n\nexport declare interface MongoManagerFilterOperators<T> extends Document { //TODO: Remove extends document when I get answer on S.O.\n $and?: MongoManagerFilter<T>[] | MongoManagerFilterOperators<T>;\n $nor?: MongoManagerFilter<T>[] | MongoManagerFilterOperators<T>;\n $or?: MongoManagerFilter<T>[] | MongoManagerFilterOperators<T>;\n $text?: {\n $search: string;\n $language?: string;\n $caseSensitive?: boolean;\n $diacriticSensitive?: boolean;\n };\n $where?: string | ((this: T) => boolean);\n $comment?: string | Document;\n}\n\n// function isDotStringRegExp(obj: Object, dotKey: string): boolean {\n// \tlet keyData = dotKey.split('.');\n// \tlet objData = obj;\n\t\n// \tfor (let i = 0; i < keyData.length; i++) {\n// \t\tlet key = keyData[i];\n// \t\tif (objData.hasOwnProperty(key)) {\n// \t\t\tobjData = objData[key];\n\t\t\t\n// \t\t\tif (i === keyData.length - 1) {\n// \t\t\t\treturn true;\n// \t\t\t}\n// \t\t}\n// \t\telse {\n// \t\t\treturn false;\n// \t\t}\n// \t}\n// }\n\n// export declare type MongoManagerDotStringFilter<T> = {\n// \t[key: string]: (isDotStringRegExp(T, key) ? any : never);\n// };\n\nexport declare type MongoManagerFilter<T> = {\n\t[P in keyof T]?: T[P] | MongoManagerFilterParamaterOperators<T[P]>;\n};\n\nexport declare type MongoManagerUnsetFilter<T> = {\n\t[P in keyof T]?: number | boolean;\n};\n\nexport declare type MongoManagerIncFilter<T> = {\n\t[P in keyof T]?: number;\n};\n\nexport declare type MongoManagerUpdateFilter<T> = {\n $inc?: MongoManagerIncFilter<T> | Document;\n $set?: MongoManagerFilter<T> | Document;\n $setOnInsert?: MongoManagerFilter<T> | Document;\n $unset?: MongoManagerUnsetFilter<T> | Document;\n};\n\nexport class MongoManager {\n\tprivate _collections: MongoManagerCollection<CollectionDocument>[] = [];\n\tprivate _nodeCache;\n\tprivate _cacheMap: {collections: string[], key: string}[] = [];\n\n\tprivate _heapSize = v8.getHeapStatistics() / numCPUs;\n\tprivate _heapLimit: number;\n\n\tprivate _serverCollections: (CollectionInfo | Pick<CollectionInfo, 'name' | 'type'>)[] = [];\n\n\tprivate _debugRemoveCacheHits = 0;\n\tprivate _debugMongoQueueCollections = [];\n\tprivate _serverConfig = null;\n\tprivate _isWorkersEnabled = false;\n\tprivate _isWorkerInstance = false;\n\n\tconstructor(serverConfig) {\n\t\tthis._serverConfig = serverConfig;\n\t\tthis._nodeCache = new NodeCache({ stdTTL: 0, checkperiod: 0 });\n\n\t\tthis._isWorkersEnabled = process.env.IS_WORKERS_ENABLED === 'true';\n\t\tthis._isWorkerInstance = process.env.IS_WORKER_INSTANCE === 'true';\n\n\t\t// Adjust cache size based on environment variables\n\t\tthis.setCacheLimit();\n\n\t\tsetInterval(() => {\n\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Mongo Manager', 'Collections', this._collections.length);\n\t\t\t\tconsole.log(new Date(), 'Mongo Manager', 'Server Collections', this._serverCollections.length);\n\t\t\t\tconsole.log(new Date(), 'Mongo Manager', 'Cache Cleanup Hits', JSON.stringify(this._debugRemoveCacheHits, null, 2));\n\t\t\t}\n\n\t\t\tthis._debugRemoveCacheHits = 0;\n\t\t\tthis._debugMongoQueueCollections = [];\n\t\t}, 60000);\n\n\t\tthis.initServerCollections();\n\n\t\tif (this._isWorkersEnabled && this._isWorkerInstance) {\n\t\t\tthis.setupChangeStream();\n\t\t}\n\t}\n\n\tprivate setCacheLimit() {\n\t\tif (this._isWorkersEnabled) {\n\t\t\tif (this._isWorkerInstance) {\n\t\t\t\tthis._heapLimit = this._heapSize * 0.8;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis._heapLimit = this._heapSize * 0.4;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tthis._heapLimit = this._heapSize * 0.3;\n\t\t}\n\t}\n\n\tasync initServerCollections() {\n\t\tlet collections = await ResolveIOServer.getMainDB().listCollections().toArray();\n\t\tthis._serverCollections = collections;\n\t}\n\n\tgetServerCollections() {\n\t\treturn this._serverCollections;\n\t}\n\n\tregisterCollection(collection: MongoManagerCollection<CollectionDocument>) {\n\t\tif (\n\t\t\tcollection.collectionOptions &&\n\t\t\tcollection.collectionOptions.timeseries &&\n\t\t\tcollection.collectionOptions.timeseries.timeField &&\n\t\t\tthis._serverCollections.some(a => a.name === collection.collectionName && a.type === 'collection')\n\t\t) {\n\t\t\tResolveIOServer.getMainDB()\n\t\t\t\t.dropCollection(collection.collectionName)\n\t\t\t\t.then(() => {\n\t\t\t\t\tthis.createCollection(collection);\n\t\t\t\t});\n\t\t}\n\n\t\tthis._collections.push(collection);\n\t}\n\n\tcreateCollection(collection: MongoManagerCollection<CollectionDocument>) {\n\t\tResolveIOServer.getMainDB().createCollection<CollectionDocument>(collection.collectionName, collection.collectionOptions);\n\t}\n\n\tcollections() {\n\t\treturn this._collections;\n\t}\n\n\tcollection(collectionName: string): MongoManagerCollection<CollectionDocument> | MongoManagerUserCollection<CollectionDocument> {\n\t\treturn this._collections.find(a => a.collectionName === collectionName);\n\t}\n\n\tpublic async find<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {},\n\t\toptions?: FindOptions<T>\n\t): Promise<T[]> {\n\t\ttry {\n\t\t\tconst cacheKey = this.generateCacheKey([collectionName], 'find', [filter, options]);\n\t\t\tlet result = this.getFromCache(cacheKey);\n\t\t\tif (result !== undefined) {\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\tconst monitor = new MonitorMongo('find', collectionName, JSON.stringify([filter, options]));\n\t\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\t\t\tresult = await collection.find(<any>filter, options).toArray();\n\t\t\tmonitor.finish();\n\n\t\t\tthis.addToCache([collectionName], cacheKey, result);\n\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tconsole.error(new Date(), 'Error in find', collectionName, error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tpublic async findOne<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tfilter: MongoManagerFilter<T> | MongoManagerFilterOperators<T> = {},\n\t\toptions?: FindOptions<T>\n\t): Promise<T> {\n\t\ttry {\n\t\t\tconst cacheKey = this.generateCacheKey([collectionName], 'findOne', [filter, options]);\n\t\t\tlet result = this.getFromCache(cacheKey);\n\t\t\tif (result !== undefined) {\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\tconst monitor = new MonitorMongo('find', collectionName, JSON.stringify([filter, options]));\n\t\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\t\t\tresult = await collection.findOne(<any>filter, options);\n\t\t\tmonitor.finish();\n\n\t\t\tthis.addToCache([collectionName], cacheKey, result);\n\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tconsole.error(new Date(), 'Error in find', collectionName, error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tpublic async aggregate<T extends CollectionDocument>(\n\t\tcollectionName: string,\n\t\tpipeline: any[],\n\t\toptions?: AggregateOptions\n\t): Promise<any[]> {\n\t\tlet collections = [collectionName];\n\n\t\tfor (const stage of pipeline) {\n\t\t\tif (stage.$lookup && stage.$lookup.from && !collections.includes(stage.$lookup.from)) {\n\t\t\t\tcollections.push(stage.$lookup.from);\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tconst cacheKey = this.generateCacheKey(collections, 'aggregate', [pipeline, options]);\n\t\t\tlet result = this.getFromCache(cacheKey);\n\t\t\tif (result !== undefined) {\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\tconst monitor = new MonitorMongo('aggregate', collectionName, JSON.stringify([pipeline, options]));\n\t\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\t\t\tresult = await collection.aggregate(pipeline, options).toArray();\n\t\t\tmonitor.finish();\n\n\t\t\tthis.addToCache(collections, cacheKey, result);\n\n\t\t\treturn result;\n\t\t}\n\t\tcatch (error) {\n\t\t\tconsole.error(new Date(), 'Error in aggregate', collectionName, error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t// Implement other methods like findOne, insertOne, updateOne, etc., similarly\n\n\tprivate generateCacheKey(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}\n\t\tcatch (error) {\n\t\t\t// If cache is corrupted or JSON parse fails, remove it\n\t\t\tthis._nodeCache.del(cacheKey);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate addToCache(collections: string[], cacheKey: string, data: any) {\n\t\tif (data && (!Array.isArray(data) || data.length)) {\n\t\t\tif (getBinarySize(JSON.stringify(data)) < 1000000) {\n\t\t\t\tlet nodeCacheSize = this._nodeCache.getStats().vsize;\n\n\t\t\t\tif (nodeCacheSize > this._heapLimit) {\n\t\t\t\t\tlet deleteCount = 0;\n\t\t\t\t\tconst keys = this._nodeCache.keys();\n\n\t\t\t\t\tfor (const key of keys) {\n\t\t\t\t\t\tthis._nodeCache.del(key);\n\t\t\t\t\t\tthis._debugRemoveCacheHits += 1;\n\t\t\t\t\t\tdeleteCount += 1;\n\n\t\t\t\t\t\tnodeCacheSize = this._nodeCache.getStats().vsize;\n\n\t\t\t\t\t\tif (nodeCacheSize < this._heapLimit * 0.75) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tconsole.log('Query Cache: ' + 'Too Big, - Deleted: ' + deleteCount + ' - ' + nodeCacheSize);\n\t\t\t\t}\n\n\t\t\t\tthis._nodeCache.set(cacheKey, JSON.stringify(data));\n\n\t\t\t\tthis._cacheMap.push({collections: collections, key: cacheKey});\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic invalidateQueryCache(collection: string) {\n\t\tlet 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}\n\n\t\tthis._cacheMap = this._cacheMap.filter(a => !a.collections.includes(collection));\n\t}\n\n\tprivate setupChangeStream() {\n\t\tconst db = ResolveIOServer.getMongoConnection().db(this._serverConfig['DATABASE']);\n\t\tconst changeStream = db.watch();\n\n\t\tchangeStream.on('change', async change => {\n\t\t\t// Call the invalidateQueryCache based on the collection affected\n\t\t\tif (change['ns'] && change['ns'].coll) {\n\t\t\t\tconst collectionName = change['ns'].coll;\n\n\t\t\t\tif (this.collection(collectionName)) {\n\t\t\t\t\tthis.invalidateQueryCache(collectionName);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tchangeStream.on('error', err => {\n\t\t\tconsole.log(new Date(), 'Mongo change stream error. Restart...');\n\t\t\tchangeStream.close();\n\t\t\tsetTimeout(() => this.setupChangeStream(), 5000); // Restart after a delay\n\t\t});\n\n\t\tchangeStream.on('close', () => {\n\t\t\tconsole.log(new Date(), 'Mongo change stream closed. Restarting...');\n\t\t\tsetTimeout(() => this.setupChangeStream(), 5000); // Restart after a delay\n\t\t});\n\t}\n}\n\nexport class MongoManagerModel<T extends CollectionDocument> {\n\tcollection_main: MongoManagerCollection<T> | MongoManagerUserCollection<T> = null;\n\tcollection_version: MongoManagerCollection<T> | MongoManagerUserCollection<T> = null;\n\n\tconstructor(options: MongoManagerCollectionOptions) {\n\t\tif (options.collectionName === 'users') {\n\t\t\tthis.collection_main = new MongoManagerUserCollection<T>(options);\n\t\t}\n\t\telse {\n\t\t\tthis.collection_main = new MongoManagerCollection<T>(options);\n\t\t}\n\n\t\tif (options.useVersionCollection) {\n\t\t\tthis.collection_main.useVersions = true;\n\t\t\t\n\t\t\tlet versionSchema = deepCopy(options.schema);\n\t\t\tversionSchema._id.type = 'Object';\n\t\t\tversionSchema._id.blackbox = true;\n\n\t\t\tlet versionOptions: MongoManagerCollectionOptions = {\n\t\t\t\tcollectionName: options.collectionName + '.versions',\n\t\t\t\tschema: versionSchema,\n\t\t\t\tuseVersionCollection: false,\n\t\t\t\tuseReportBuilder: false,\n\t\t\t\treportBuilderLookupTables: [],\n\t\t\t\ttimestamps: true,\n\t\t\t\tcreateLogs: false,\n\t\t\t\tcheckSchema: false,\n\t\t\t\tcollectionOptions: null\n\t\t\t};\n\n\t\t\tif (options.collectionName === 'users') {\t\n\t\t\t\tthis.collection_version = new MongoManagerUserCollection<T>(versionOptions);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.collection_version = new MongoManagerCollection<T>(versionOptions);\n\t\t\t}\n\n\t\t\tthis.collection_version.createIndex({'_id._id': 1, '_id.__v': 1});\n\t\t\tthis.collection_main.versionCollection = options.collectionName + '.versions';\n\t\t}\n\t}\n}\n\nexport interface MongoManagerCollectionOptions {\n\tcollectionName: string;\n\tschema: object;\n\tuseVersionCollection: boolean;\n\tuseReportBuilder: boolean;\n\treportBuilderLookupTables: LookupTables[]\n\ttimestamps: boolean;\n\tcreateLogs: boolean;\n\tcheckSchema: boolean;\n\tcollectionOptions: CreateCollectionOptions;\n}\n\nexport class MongoManagerCollection<T extends CollectionDocument> {\n\tcollectionName = '';\n\tcheckSchema = false;\n\tsimplschema = null;\n\trbSchema = null;\n\ttimestamps = false;\n\tuseVersions = false;\n\tversionCollection = '';\n\tcreateLogs = true;\n\tuseRB = false;\n\tcollectionOptions: CreateCollectionOptions;\n\t\n\tconstructor(options: MongoManagerCollectionOptions) {\n\t\tthis.collectionName = options.collectionName;\n\t\tthis.simplschema = new SimpleSchema(options.schema);\n\t\tthis.timestamps = options.timestamps;\n\t\tthis.createLogs = options.createLogs;\n\t\tthis.checkSchema = options.checkSchema;\n\t\tthis.collectionOptions = options.collectionOptions;\n\n\t\tif (options.useReportBuilder) {\n\t\t\tthis.useRB = true;\n\t\t\tlet schemaCopy = deepCopy(options.schema);\n\t\t\tlet rbSchema = buildRbLookups(options.reportBuilderLookupTables, schemaCopy, []);\n\t\t\tthis.rbSchema = buildRbSchema(rbSchema);\n\t\t}\n\n\t\tlet interval = setInterval(() => {\n\t\t\tif (ResolveIOServer && ResolveIOServer.getMainServer() && ResolveIOServer.getMongoManager() && ResolveIOServer.getMongoManager().getServerCollections().length) {\n\t\t\t\tResolveIOServer.getMongoManager().registerCollection(this);\n\t\t\t\tclearInterval(interval);\n\t\t\t}\n\t\t}, 1);\n\t}\n\n\tprivate static indexQueue = async.queue(async (task, callback) => {\n const { action, collection, specs, options } = task;\n \n const dbCollection = ResolveIOServer.getMainDB().collection(collection.collectionName, collection.collectionOptions);\n \n if (!dbCollection) {\n return callback(new Error(`Collection ${collection.collectionName} not found`));\n }\n\n let monitor = new MonitorMongo(action, collection.collectionName, JSON.stringify([specs, options]));\n\n const createIndex = async () => {\n try {\n const result = await dbCollection[action](...specs, options);\n monitor.finish();\n callback(null, result);\n } catch (err) {\n if (err.code === 85 || err.message.includes('IndexOptionsConflict')) {\n try {\n const existingIndexName = collection.extractIndexNameFromError(err.message);\n if (existingIndexName) {\n await dbCollection.dropIndex(existingIndexName);\n return await createIndex();\n }\n } catch (innerError) {\n callback(innerError);\n }\n }\n monitor.finish();\n callback(err);\n }\n };\n\n await createIndex();\n }, 1);\n\n // Method to extract index name from error message\n extractIndexNameFromError(errorMessage) {\n\t\tlet regexPattern = /Index already exists with a different name: (\\S+)/;\n\t\tlet matches = errorMessage.match(regexPattern);\n\t\n\t\tif (!matches || matches.length <= 1) {\n\t\t\t// If the first pattern doesn't match, try the second pattern\n\t\t\tregexPattern = /existing index:.*name: \"([^\"]+)\"/;\n\t\t\tmatches = errorMessage.match(regexPattern);\n\t\t}\n\t\n\t\treturn matches && matches.length > 1 ? matches[1] : null;\n\t}\t\n\n\taggregate(pipeline: object[], options?: AggregateOptions, skipCache = false) : Promise<any[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tif (!skipCache) {\n\t\t\t\tResolveIOServer.getMongoManager().aggregate(this.collectionName, pipeline, options).then(res => {\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet monitor = new MonitorMongo('aggregate', this.collectionName, JSON.stringify([pipeline, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options).toArray().then(res => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Aggregate', this.collectionName, pipeline, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tasync aggregateCount(pipeline: object[], options?: AggregateOptions) : Promise<number> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('aggregateCount', this.collectionName, JSON.stringify([pipeline, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options).toArray().then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res.length);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Aggregate', this.collectionName, pipeline, options, err);\n\t\t\t\treject(0);\n\t\t\t});\n\t\t});\n\t}\n\n\taggregateCursor(pipeline: object[], options?: AggregateOptions): AggregationCursor {\n\t\tlet monitor = new MonitorMongo('aggregateCursor', this.collectionName, JSON.stringify([pipeline, options]));\n\t\tlet cursor = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options);\n\t\tcursor.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn cursor;\n\t}\n\n\taggregateStream(pipeline: object[], options?: AggregateOptions, streamOptions?: CursorStreamOptions) {\n\t\tlet monitor = new MonitorMongo('aggregateStream', this.collectionName, JSON.stringify([pipeline, options, streamOptions]));\n\t\tlet stream = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options).stream(streamOptions);\n\t\tstream.on('end', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('error', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn stream;\n\t}\n\n\t// bulkWrite(operations: AnyBulkWriteOperation<T>[], options: BulkWriteOptions): Promise<BulkWriteResult> {\n\tbulkWrite(operations: any[], options?: BulkWriteOptions, bypassLogs = false, bypassCheckSchema = false): Promise<BulkWriteResult> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!operations.length) {\n\t\t\t\tresolve(null);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst logs = [];\n\t\t\tconst versionOps = []; // For storing versioning ops\n\t\t\tconst deleteOldVersionsOps = []; // For deleteMany operations to remove older versions\n\t\t\tconst bulkOps = [];\n\t\t\tconst updateFilters = [];\n\t\t\tconst updateManyFilters = [];\n\t\t\tconst deleteManyFilters = [];\n\t\n\t\t\t// Collect filters for all operations\n\t\t\toperations.forEach(op => {\n\t\t\t\tconst opType = Object.keys(op)[0];\n\t\t\t\tif (opType === 'updateOne' || opType === 'deleteOne' || opType === 'replaceOne') {\n\t\t\t\t\tupdateFilters.push(op[opType].filter); // Store filters for updateOne, deleteOne, and replaceOne\n\t\t\t\t}\n\t\t\t\telse if (opType === 'updateMany') {\n\t\t\t\t\tupdateManyFilters.push(op[opType].filter); // Store the entire filter for updateMany\n\t\t\t\t}\n\t\t\t\telse if (opType === 'deleteMany') {\n\t\t\t\t\tdeleteManyFilters.push(op[opType].filter); // Store the entire filter for deleteMany\n\t\t\t\t}\n\t\t\t});\n\t\n\t\t\t// Pre-fetch all documents based on the filters before proceeding with the bulk operations\n\t\t\tconst currentDocs = updateFilters.length || updateManyFilters.length || deleteManyFilters.length\n\t\t\t\t? await this.find(<any>{ $or: [...updateFilters, ...updateManyFilters, ...deleteManyFilters] })\n\t\t\t\t: [];\n\n\t\t\t// Helper function to get the value from a document using a dot-notated key (e.g., 'obj.property')\n\t\t\t// This will also handle arrays of objects (e.g., 'obj.arrayOfObjects.property')\n\t\t\tconst getNestedValue = (doc, key) => {\n\t\t\t\tconst parts = key.split('.');\n\n\t\t\t\treturn parts.reduce((acc, part) => {\n\t\t\t\t\tif (Array.isArray(acc)) {\n\t\t\t\t\t\t// If we're dealing with an array, return an array of values for each element\n\t\t\t\t\t\treturn acc.map(item => item[part]).filter(val => val !== undefined);\n\t\t\t\t\t}\n\t\t\t\t\treturn acc && acc[part];\n\t\t\t\t}, doc);\n\t\t\t};\n\t\n\t\t\t// Helper function to locally find matching documents based on filter\n\t\t\tconst findMatchingDocs = (filter) => {\n\t\t\t\treturn currentDocs.filter(doc => {\n\t\t\t\t\treturn matchDocument(filter, doc);\n\t\t\t\t});\n\t\t\t};\n\n\t\t\tconst matchDocument = (filter, doc) => {\n\t\t\t\treturn Object.keys(filter).every(key => {\n\t\t\t\t\tconst value = filter[key];\n\t\t\t\t\tconst docValue = getNestedValue(doc, key); // Get nested value from the document\n\t\t\t\n\t\t\t\t\t// Handle logical operators\n\t\t\t\t\tif (key === '$and') {\n\t\t\t\t\t\treturn value.every(subFilter => matchDocument(subFilter, doc));\n\t\t\t\t\t}\n\t\t\t\n\t\t\t\t\tif (key === '$or') {\n\t\t\t\t\t\treturn value.some(subFilter => matchDocument(subFilter, doc));\n\t\t\t\t\t}\n\t\t\t\n\t\t\t\t\t// If docValue is an array, apply filter conditions to each element\n\t\t\t\t\tif (Array.isArray(docValue)) {\n\t\t\t\t\t\treturn docValue.some(val => evaluateCondition(value, val));\n\t\t\t\t\t}\n\t\t\t\n\t\t\t\t\t// Otherwise, apply the condition to the single value\n\t\t\t\t\treturn evaluateCondition(value, docValue);\n\t\t\t\t});\n\t\t\t};\n\t\t\t\n\t\t\t// Helper function to evaluate the condition (value) against the document value (docValue)\n\t\t\tconst evaluateCondition = (condition, docValue) => {\n\t\t\t\t// If condition is an object, handle operators like $in, $nin, $ne, etc.\n\t\t\t\tif (condition instanceof Object) {\n\t\t\t\t\tif ('$in' in condition) {\n\t\t\t\t\t\treturn condition.$in.includes(docValue);\n\t\t\t\t\t}\n\t\t\t\t\tif ('$nin' in condition) {\n\t\t\t\t\t\treturn !condition.$nin.includes(docValue);\n\t\t\t\t\t}\n\t\t\t\t\tif ('$ne' in condition) {\n\t\t\t\t\t\treturn docValue !== condition.$ne;\n\t\t\t\t\t}\n\t\t\t\t\tif ('$gt' in condition) {\n\t\t\t\t\t\treturn docValue > condition.$gt;\n\t\t\t\t\t}\n\t\t\t\t\tif ('$gte' in condition) {\n\t\t\t\t\t\treturn docValue >= condition.$gte;\n\t\t\t\t\t}\n\t\t\t\t\tif ('$lt' in condition) {\n\t\t\t\t\t\treturn docValue < condition.$lt;\n\t\t\t\t\t}\n\t\t\t\t\tif ('$lte' in condition) {\n\t\t\t\t\t\treturn docValue <= condition.$lte;\n\t\t\t\t\t}\n\t\t\t\t\tif ('$exists' in condition) {\n\t\t\t\t\t\treturn (docValue !== undefined) === condition.$exists;\n\t\t\t\t\t}\n\t\t\t\t\tif ('$regex' in condition) {\n\t\t\t\t\t\tconst regex = new RegExp(condition.$regex, condition.$options || '');\n\t\t\t\t\t\treturn regex.test(docValue);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\n\t\t\t\t// Handle regular equality comparison\n\t\t\t\treturn docValue === condition;\n\t\t\t};\n\t\n\t\t\tfor (const op of operations) {\n\t\t\t\tconst opType = Object.keys(op)[0];\n\t\t\t\tlet doc = op[opType];\n\t\n\t\t\t\tif (opType === 'insertOne') {\n\t\t\t\t\t// Ensure _id and __v for insertOne operations\n\t\t\t\t\tif (!doc.document._id) {\n\t\t\t\t\t\tdoc.document._id = objectIdHexString();\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (this.useVersions && !doc.document.hasOwnProperty('__v')) {\n\t\t\t\t\t\tdoc.document.__v = 0;\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tlet date = new Date();\n\n\t\t\t\t\t\tif (!doc.document.createdAt) {\n\t\t\t\t\t\t\tdoc.document.createdAt = date;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!doc.document.updatedAt) {\n\t\t\t\t\t\t\tdoc.document.updatedAt = date;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\t\tconst isValid = validation.validate(doc.document);\n\t\t\n\t\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - bulkWrite - insertOne', validation.validationErrors());\n\t\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on bulkWrite insertOne - ' + this.collectionName, [validation.validationErrors(), doc.document]);\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t// Log the operation\n\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\tid_document: doc.document._id,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options])) < 200000 ? JSON.stringify([op, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\n\t\t\t\t\tbulkOps.push(op); // Add insertOne operation to bulkOps\n\t\t\t\t} \n\t\t\t\telse if (opType === 'updateOne') {\t\n\t\t\t\t\t// Find all matching documents locally based on filter\n\t\t\t\t\tconst matchingDocs = findMatchingDocs(doc.filter);\n\t\n\t\t\t\t\tif (matchingDocs.length) {\n\t\t\t\t\t\tfor (let currentDoc of matchingDocs) {\n\t\t\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\t\t\tif (doc.update.$set) {\n\t\t\t\t\t\t\t\t\tdoc.update.$set.updatedAt = new Date();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\tdoc.update.$set = { updatedAt: new Date() };\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\t\t\t\tconst isValid = validation.validate(doc.update, {modifier: true});\n\t\t\t\t\n\t\t\t\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - bulkWrite - updateOne', validation.validationErrors());\n\t\t\t\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on bulkWrite updateOne - ' + this.collectionName, [validation.validationErrors(), doc.update, currentDoc]);\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\t\tlet versionDoc = deepCopy(currentDoc);\n\n\t\t\t\t\t\t\t\tversionDoc._id = <any>{_id: versionDoc._id, __v: versionDoc.__v};\n\n\t\t\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\t\tdocument: versionDoc\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\n\t\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.update, '__v')) {\n\t\t\t\t\t\t\t\t\tif (!doc.update.$inc) {\n\t\t\t\t\t\t\t\t\t\tdoc.update.$inc = { __v: 1 };\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\tdoc.update.$inc.__v = 1;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\t\t// Delete old versions if __v >= 4\n\t\t\t\t\t\t\t\tif (versionDoc.__v >= 4) {\n\t\t\t\t\t\t\t\t\tdeleteOldVersionsOps.push({\n\t\t\t\t\t\t\t\t\t\tdeleteMany: {\n\t\t\t\t\t\t\t\t\t\t\tfilter: {\n\t\t\t\t\t\t\t\t\t\t\t\t'_id._id': versionDoc._id._id,\n\t\t\t\t\t\t\t\t\t\t\t\t'_id.__v': { $lt: versionDoc.__v - 4 }\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\t\tid_document: currentDoc._id,\n\t\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options, currentDoc])) < 200000 ? JSON.stringify([op, options, currentDoc], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\tbulkOps.push(op); // Add updateOne or replaceOne operation to bulkOps\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (doc.upsert) {\n\t\t\t\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\t\t\t\tconst isValid = validation.validate(doc.update, {modifier: true});\n\t\t\t\t\n\t\t\t\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - bulkWrite - updateOne', validation.validationErrors());\n\t\t\t\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on bulkWrite updateOne - ' + this.collectionName, [validation.validationErrors(), doc.update]);\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.update, '_id')) {\n\t\t\t\t\t\t\t\tdoc.update.$setOnInsert._id = objectIdHexString();\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.update, '__v')) {\n\t\t\t\t\t\t\t\t\tdoc.update.$setOnInsert.__v = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n \n\t\t\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.update, 'createdAt')) {\n\t\t\t\t\t\t\t\t\tdoc.update.$setOnInsert.createdAt = new Date();\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.update, 'updatedAt')) {\n\t\t\t\t\t\t\t\t\tdoc.update.$setOnInsert.updatedAt = new Date();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\t\tid_document: doc.update.$setOnInsert._id,\n\t\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options, doc.update])) < 200000 ? JSON.stringify([op, options, doc.update], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\tbulkOps.push(op); // Add updateOne or replaceOne operation to bulkOps\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (opType === 'replaceOne') {\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tdoc.replacement.updatedAt = new Date();\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Find all matching documents locally based on filter\n\t\t\t\t\tconst matchingDocs = findMatchingDocs(doc.filter);\n\t\n\t\t\t\t\tif (matchingDocs.length) {\n\t\t\t\t\t\tfor (let currentDoc of matchingDocs) {\n\t\t\t\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\t\t\t\tconst isValid = validation.validate(doc.replacement);\n\t\t\t\t\n\t\t\t\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - bulkWrite - insertOne', validation.validationErrors());\n\t\t\t\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on bulkWrite replaceOne - ' + this.collectionName, [validation.validationErrors(), doc.replacement]);\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\t\tlet versionDoc = deepCopy(currentDoc);\n\n\t\t\t\t\t\t\t\tversionDoc._id = <any>{_id: versionDoc._id, __v: versionDoc.__v};\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\t\tdocument: versionDoc\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\n\t\t\t\t\t\t\t\tdoc.replacement.__v = versionDoc.__v + 1;\n\t\t\n\t\t\t\t\t\t\t\t// Delete old versions if __v >= 4\n\t\t\t\t\t\t\t\tif (versionDoc.__v >= 4) {\n\t\t\t\t\t\t\t\t\tdeleteOldVersionsOps.push({\n\t\t\t\t\t\t\t\t\t\tdeleteMany: {\n\t\t\t\t\t\t\t\t\t\t\tfilter: {\n\t\t\t\t\t\t\t\t\t\t\t\t'_id._id': versionDoc._id._id,\n\t\t\t\t\t\t\t\t\t\t\t\t'_id.__v': { $lt: versionDoc.__v - 4 }\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\t\tid_document: currentDoc._id,\n\t\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options, currentDoc])) < 200000 ? JSON.stringify([op, options, currentDoc], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\tbulkOps.push(op); // Add updateOne or replaceOne operation to bulkOps\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (doc.upsert) {\n\t\t\t\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\t\t\t\tconst isValid = validation.validate(doc.replacement);\n\t\t\t\t\n\t\t\t\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - bulkWrite - replaceOne', validation.validationErrors());\n\t\t\t\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on bulkWrite replaceOne - ' + this.collectionName, [validation.validationErrors(), doc.replacement]);\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.replacement, '_id')) {\n\t\t\t\t\t\t\t\tdoc.replacement._id = objectIdHexString();\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.replacement, '__v')) {\n\t\t\t\t\t\t\t\t\tdoc.replacement.__v = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n \n\t\t\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.replacement, 'createdAt')) {\n\t\t\t\t\t\t\t\t\tdoc.replacement.createdAt = new Date();\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.replacement, 'updatedAt')) {\n\t\t\t\t\t\t\t\t\tdoc.replacement.updatedAt = new Date();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\t\tid_document: doc.replacement._id,\n\t\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options, doc.replacement])) < 200000 ? JSON.stringify([op, options, doc.replacement], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\tbulkOps.push(op); // Add updateOne or replaceOne operation to bulkOps\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (opType === 'deleteOne') {\n\t\t\t\t\t// Find all matching documents locally based on filter\n\t\t\t\t\tconst matchingDocs = findMatchingDocs(doc.filter);\n\t\t\t\t\t\n\t\t\t\t\tmatchingDocs.forEach(currentDoc => {\n\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\tlet versionDoc = deepCopy(currentDoc);\n\n\t\t\t\t\t\t\tversionDoc._id = <any>{_id: versionDoc._id, __v: versionDoc.__v};\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: versionDoc\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\n\t\t\t\t\t\t\t// Delete old versions if __v >= 4\n\t\t\t\t\t\t\tif (versionDoc.__v >= 4) {\n\t\t\t\t\t\t\t\tdeleteOldVersionsOps.push({\n\t\t\t\t\t\t\t\t\tdeleteMany: {\n\t\t\t\t\t\t\t\t\t\tfilter: {\n\t\t\t\t\t\t\t\t\t\t\t'_id._id': versionDoc._id._id,\n\t\t\t\t\t\t\t\t\t\t\t'_id.__v': { $lt: versionDoc.__v - 4 }\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\tid_document: currentDoc._id,\n\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options, currentDoc])) < 200000 ? JSON.stringify([op, options, currentDoc], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tbulkOps.push(op); // Add deleteOne operation to bulkOps\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (opType === 'updateMany') {\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tif (doc.update.$set) {\n\t\t\t\t\t\t\tdoc.update.$set.updatedAt = new Date();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdoc.update.$set = {\n\t\t\t\t\t\t\t\tupdatedAt: new Date()\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.update, '__v')) {\n\t\t\t\t\t\t\tif (!doc.update.$inc) {\n\t\t\t\t\t\t\t\tdoc.update.$inc = { __v: 1 };\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tdoc.update.$inc.__v = 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Process all documents matching the updateMany filter locally\n\t\t\t\t\tconst matchingDocs = findMatchingDocs(doc.filter);\n\t\n\t\t\t\t\tfor (let currentDoc of matchingDocs) {\n\t\t\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\t\t\tconst isValid = validation.validate(doc.update, {modifier: true});\n\t\t\t\n\t\t\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - bulkWrite - insertOne', validation.validationErrors());\n\t\t\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on bulkWrite updateMany - ' + this.collectionName, [validation.validationErrors(), doc.update]);\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\tlet versionDoc = deepCopy(currentDoc);\n\n\t\t\t\t\t\t\tversionDoc._id = <any>{_id: versionDoc._id, __v: versionDoc.__v};\n\n\t\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: versionDoc\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\n\t\t\t\t\t\t\t// Delete old versions if __v >= 4\n\t\t\t\t\t\t\tif (versionDoc.__v >= 4) {\n\t\t\t\t\t\t\t\tdeleteOldVersionsOps.push({\n\t\t\t\t\t\t\t\t\tdeleteMany: {\n\t\t\t\t\t\t\t\t\t\tfilter: {\n\t\t\t\t\t\t\t\t\t\t\t'_id._id': versionDoc._id._id,\n\t\t\t\t\t\t\t\t\t\t\t'_id.__v': { $lt: versionDoc.__v - 4 }\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\tid_document: currentDoc._id,\n\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options])) < 200000 ? JSON.stringify([op, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tbulkOps.push(op); // Add updateMany operation to bulkOps\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (opType === 'deleteMany') {\n\t\t\t\t\t// Process all documents matching the deleteMany filter locally\n\t\t\t\t\tconst matchingDocs = findMatchingDocs(doc.filter);\n\t\n\t\t\t\t\tmatchingDocs.forEach(currentDoc => {\n\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\tlet versionDoc = deepCopy(currentDoc);\n\n\t\t\t\t\t\t\tversionDoc._id = <any>{_id: versionDoc._id, __v: versionDoc.__v};\n\n\t\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: versionDoc\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\n\t\t\t\t\t\t\t// Delete old versions if __v >= 4\n\t\t\t\t\t\t\tif (versionDoc.__v >= 4) {\n\t\t\t\t\t\t\t\tdeleteOldVersionsOps.push({\n\t\t\t\t\t\t\t\t\tdeleteMany: {\n\t\t\t\t\t\t\t\t\t\tfilter: {\n\t\t\t\t\t\t\t\t\t\t\t'_id._id': versionDoc._id._id,\n\t\t\t\t\t\t\t\t\t\t\t'_id.__v': { $lt: versionDoc.__v - 4 }\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\tid_document: currentDoc._id,\n\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options])) < 200000 ? JSON.stringify([op, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tbulkOps.push(op); // Add deleteMany operation to bulkOps\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\ttry {\n\t\t\t\tif (bulkOps.length) {\n\t\t\t\t\tlet monitor = new MonitorMongo('bulkWrite', this.collectionName, JSON.stringify([bulkOps.slice(-100), options]));\n\t\t\t\t\t\n\t\t\t\t\t// First, perform the main bulk operations on the collection\n\t\t\t\t\tconst mainResult = await ResolveIOServer.getMainDB().collection<T>(this.collectionName).bulkWrite(bulkOps, options);\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\n\t\t\t\t\t// Separate bulkWrite for versions (if any versioning is required)\n\t\t\t\t\tif (versionOps.length || deleteOldVersionsOps.length) {\n\t\t\t\t\t\tawait ResolveIOServer.getMainDB().collection<T>(this.versionCollection).bulkWrite([...versionOps, ...deleteOldVersionsOps]);\n\t\t\t\t\t}\n\t\t\n\t\t\t\t\t// Separate bulkWrite for logs (if logging is enabled)\n\t\t\t\t\tif (!bypassLogs && logs.length) {\n\t\t\t\t\t\tawait Logs.bulkWrite(logs);\n\t\t\t\t\t}\n\t\t\n\t\t\t\t\tmonitor.finish();\n\t\n\t\t\t\t\tresolve(mainResult); // Resolve with the result of the main bulkWrite\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tresolve(null);\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tconsole.log(new Date(), 'Error Bulk Write', this.collectionName, bulkOps.slice(-100), options, err);\n\t\t\t\treject(err);\n\t\t\t}\n\t\t});\n\t}\n\n\tcountDocuments(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: CountDocumentsOptions): Promise<number> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('countDocuments', this.collectionName, JSON.stringify([filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).countDocuments(<any>filter, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Count Documents', this.collectionName, filter, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\t//Helper Function (1 or Many) - Not Real Mongo Function\n\tcreate(f_docs: T | T[], options?: InsertOneOptions | BulkWriteOptions): Promise<T | T[]> {\n\t\tif (!Array.isArray(f_docs)) {\n\t\t\treturn this.insertOne(f_docs, <InsertOneOptions>options);\n\t\t}\n\t\telse if (f_docs.length === 1) {\n\t\t\treturn this.insertOne(f_docs[0], <InsertOneOptions>options);\n\t\t}\n\n\t\treturn this.insertMany(f_docs, <BulkWriteOptions>options);\n\t}\n\n\tcreateIndex(fieldOrSpec: any, options?: CreateIndexesOptions): Promise<string> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tMongoManagerCollection.indexQueue.push({\n\t\t\t\taction: 'createIndex',\n\t\t\t\tcollection: this, // Current instance\n\t\t\t\tspecs: [fieldOrSpec],\n\t\t\t\toptions: options\n\t\t\t}, (err, result) => {\n\t\t\t\tif (err) reject(err);\n\t\t\t\telse resolve(result);\n\t\t\t});\n\t\t});\n\t}\n\t\n\tcreateIndexes(indexSpecs: IndexDescription[], options?: CreateIndexesOptions): Promise<string[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tMongoManagerCollection.indexQueue.push({\n\t\t\t\taction: 'createIndexes',\n\t\t\t\tcollection: this, // Current instance\n\t\t\t\tspecs: [indexSpecs],\n\t\t\t\toptions: options\n\t\t\t}, (err, result) => {\n\t\t\t\tif (err) reject(err);\n\t\t\t\telse resolve(result);\n\t\t\t});\n\t\t});\n\t}\n\n\tdeleteMany(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: DeleteOptions, bypassLogs = false): Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\tlet docs = await this.find(filter);\n\n\t\t\t\tfor (let i = 0; i < docs.length; i++) {\n\t\t\t\t\tlet doc = docs[i];\n\t\t\t\t\n\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, options])) < 200000 ? JSON.stringify([doc, filter, options], null, 2) : 'Too Big',\n\t\t\t\t\t\tmethod: 'deleteMany',\n\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\troute: ''\n\t\t\t\t\t});\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 1}}]});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('deleteMany', this.collectionName, JSON.stringify([filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).deleteMany(<any>filter, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\tresolve(res.deletedCount);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Delete Many', this.collectionName, filter, options, err);\n\t\t\t\treject(err)\n\t\t\t});\n\t\t});\n\t}\n\n\tdeleteOne(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOneAndDeleteOptions, bypassLogs = false): Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\tlet monitor = new MonitorMongo('findOneAndDelete', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndDelete(<any>filter, options).then(async returnVal => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tlet doc = returnVal;\n\n\t\t\t\t\tif (doc) {\n\t\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, options])) < 200000 ? JSON.stringify([doc, filter, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'deleteOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\t\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 1}}]});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\n\t\t\t\t\t\tresolve(1);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tresolve(0);\n\t\t\t\t\t}\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Find One And Delete', this.collectionName, filter, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet monitor = new MonitorMongo('deleteOne', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).deleteOne(<any>filter, options).then(res => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\tresolve(res.deletedCount);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t}\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Delete One', this.collectionName, filter, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\t\t\t\n\t\t});\n\t}\n\n\tdistinct(key: string, filter?: MongoManagerFilter<T> & MongoManagerFilterOperators<T>, options?: CommandOperationOptions): Promise<T[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('distinct', this.collectionName, JSON.stringify([key, filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).distinct(key, <any>filter, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Distinct', this.collectionName, filter, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tdrop(options?: CommandOperationOptions): Promise<boolean> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('drop', this.collectionName, JSON.stringify([options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).drop(options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Count Documents', this.collectionName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tdropIndex(indexName: string, options?: CommandOperationOptions): Promise<Document> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('dropIndex', this.collectionName, JSON.stringify([indexName, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).dropIndex(indexName, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(<Document>res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Drop Index', this.collectionName, indexName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tdropIndexes(options?: CommandOperationOptions): Promise<Boolean> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('dropIndexes', this.collectionName, JSON.stringify([options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).dropIndexes(options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Drop Indexes', this.collectionName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tfind(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>, skipCache = false): Promise<T[]> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!skipCache) {\n\t\t\t\tResolveIOServer.getMongoManager().find(this.collectionName, filter, options).then(res => {\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet monitor = new MonitorMongo('find', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).find<T>(<any>filter, options).toArray().then(res => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Find', this.collectionName, filter, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tfindById(id: string, options?: FindOptions<T>): Promise<T> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('findById', this.collectionName, JSON.stringify([{_id: id}, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOne<T>(<any>{_id: id}, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find By Id', this.collectionName, {_id: id}, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tfindCount(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>): Promise<Number> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('findCount', this.collectionName, JSON.stringify([filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).find(<any>filter, options).count().then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find Count', this.collectionName, filter, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tfindCursor(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>): FindCursor {\n\t\tlet monitor = new MonitorMongo('findCursor', this.collectionName, JSON.stringify([filter, options]));\n\t\tlet cursor = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).find(<any>filter, options);\n\t\tcursor.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\tcursor.removeAllListeners();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn cursor;\n\t}\n\n\tfindStream(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>, streamOptions?: CursorStreamOptions) {\n\t\tlet monitor = new MonitorMongo('findStream', this.collectionName, JSON.stringify([filter, options, streamOptions]));\n\t\tlet stream = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).find(<any>filter, options).stream(streamOptions);\n\t\tstream.on('end', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('error', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn stream;\n\t}\n\n\tfindOne(filter: MongoManagerFilter<T> | MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>, skipCache = false): Promise<T> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tif (!skipCache) {\n\t\t\t\tResolveIOServer.getMongoManager().findOne(this.collectionName, filter, options).then(res => {\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet monitor = new MonitorMongo('findOne', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOne<T>(<any>filter, options).then(res => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Find One', this.collectionName, filter, options, err);\n\t\t\t\t\treject(err)\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tfindOneAndDelete(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOneAndDeleteOptions, bypassLogs = false): Promise<T> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('findOneAndDelete', this.collectionName, JSON.stringify([filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndDelete(<any>filter, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tlet doc = res;\n\t\t\t\t\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, options])) < 200000 ? JSON.stringify([doc, filter, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'findOneAndDelete',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t}\n\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\n\t\t\t\t\tresolve(<T>doc);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tresolve(null);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find One And Delete', this.collectionName, filter, options, err);\n\t\t\t\treject(err)\n\t\t\t});\n\t\t});\n\t}\n\n\tfindOneAndReplace(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, replacement: T, options?: FindOneAndReplaceOptions, bypassLogs = false, bypassCheckSchema = false): Promise<T> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(replacement);\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - findOneAndReplace', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on findOneAndReplace - ' + this.collectionName, [validation.validationErrors(), replacement]);\n\t\t\t\t\t\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tlet date = new Date();\n\n\t\t\tif (this.timestamps) {\n\t\t\t\treplacement.updatedAt = date;\n\t\t\t}\n\n\t\t\tif (options && options.upsert) {\n\t\t\t\tif (!replacement._id) {\n\t\t\t\t\treplacement._id = objectIdHexString();\n\t\t\t\t}\n\n\t\t\t\tif (this.useVersions) {\n\t\t\t\t\treplacement.__v = 0;\n\t\t\t\t}\n\n\t\t\t\tif (this.timestamps && !replacement.createdAt) {\n\t\t\t\t\treplacement.createdAt = date;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('findOneAndReplace', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndReplace(<any>filter, replacement, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tlet doc = res;\n\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, replacement, options])) < 200000 ? JSON.stringify([doc, filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'findOneAndReplace',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t}\n\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\n\t\t\t\t\tresolve(<T>doc);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tresolve(null);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find One And Replace', this.collectionName, filter, options, err);\n\t\t\t\treject(err)\n\t\t\t});\n\t\t});\n\t}\n\n\tfindOneAndUpdate(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, update: MongoManagerUpdateFilter<T>, options?: FindOneAndUpdateOptions, bypassLogs = false, bypassCheckSchema = false): Promise<T> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(update, {modifier: true});\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - findOneAndUpdate', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on findOneAndUpdate - ' + this.collectionName, [validation.validationErrors(), update]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.timestamps) {\n\t\t\t\tlet date = new Date(); \n\t\t\t\t\n\t\t\t\tif (!update.$set) {\n\t\t\t\t\tupdate.$set = <any>{updatedAt: date};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tupdate.$set.updatedAt = date;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (options && options.upsert) {\n\t\t\t\tif (!update.$setOnInsert) {\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t_id: objectIdHexString()\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (!update.$setOnInsert._id) {\n\t\t\t\t\t\tupdate.$setOnInsert._id = objectIdHexString();\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.timestamps && !update.$setOnInsert.createdAt) {\n\t\t\t\t\t\tupdate.$setOnInsert.createdAt = new Date();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('findOneAndUpdate', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndUpdate(<any>filter, <any>update, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tlet doc = res;\n\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\t\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, options])) < 200000 ? JSON.stringify([doc, filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'findOneAndUpdate',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t}\n\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\n\t\t\t\t\tresolve(<T>doc);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tresolve(null);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find One And Update', this.collectionName, filter, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tindexes(options: IndexInformationOptions): Promise<any[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('indexes', this.collectionName, JSON.stringify([options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).indexes(options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Indexes', this.collectionName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tindexExists(indexes: string | string[], options?: IndexInformationOptions): Promise<boolean> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('indexExists', this.collectionName, JSON.stringify([indexes, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).indexExists(indexes, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Index Exists', this.collectionName, indexes, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tinsertMany(docs: T[], options?: BulkWriteOptions, bypassLogs = false, bypassCheckSchema = false, bypassMonitor = false): Promise<T[]> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!docs.length) {\n\t\t\t\tresolve([]);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tlet validationResults = [];\n\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tdocs.forEach(doc => {\n\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\tconst isValid = validation.validate(doc);\n\n\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - insertMany', validation.validationErrors());\n\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on insertMany - ' + this.collectionName, [validation.validationErrors(), doc]);\n\t\t\t\t\t\tvalidationResults.push(false);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tvalidationResults.push(true);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlet validDocs = this.checkSchema ? docs.filter((a, idx) => validationResults[idx]) : docs;\n\n\t\t\tfor (let i = 0; i < validDocs.length; i++) {\n\t\t\t\tlet doc = validDocs[i];\n\n\t\t\t\tif (!doc._id) {\n\t\t\t\t\tdoc._id = objectIdHexString();\n\t\t\t\t}\n\n\t\t\t\tif (this.timestamps) {\n\t\t\t\t\tlet date = new Date();\n\n\t\t\t\t\tif (!doc.createdAt) {\n\t\t\t\t\t\tdoc.createdAt = date;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!doc.updatedAt) {\n\t\t\t\t\t\tdoc.updatedAt = date;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this.useVersions && !doc.hasOwnProperty('__v')) {\n\t\t\t\t\tdoc.__v = 0;\n\t\t\t\t}\n\n\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, options])) < 200000 ? JSON.stringify([doc, options], null, 2) : 'Too Big',\n\t\t\t\t\t\tmethod: 'insertMany',\n\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\troute: ''\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (validDocs.length) {\n\t\t\t\tlet monitor = null;\n\t\t\t\t\n\t\t\t\tif (!bypassMonitor) {\n\t\t\t\t\tmonitor = new MonitorMongo('insertMany', this.collectionName, JSON.stringify([validDocs, options]));\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).insertMany(<OptionalUnlessRequiredId<T>[]>validDocs, options).then(res => {\n\t\t\t\t\tif (monitor) {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t}\n\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\tresolve(validDocs);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t}\n\t\t\t\t}, err => {\n\t\t\t\t\tif (monitor) {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t}\n\t\t\t\t\tconsole.log(new Date(), 'Error Insert Many', this.collectionName, validDocs, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tinsertOne(doc: T, options?: InsertOneOptions, bypassLogs = false, bypassCheckSchema = false): Promise<T> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!doc._id) {\n\t\t\t\tdoc._id = objectIdHexString();\n\t\t\t}\n\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(doc);\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - insertOne', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on insertOne - ' + this.collectionName, [validation.validationErrors(), doc]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.timestamps) {\n\t\t\t\tlet date = new Date();\n\t\t\t\n\t\t\t\tif (!doc.createdAt) {\n\t\t\t\t\tdoc.createdAt = date;\n\t\t\t\t}\n\n\t\t\t\tif (!doc.updatedAt) {\n\t\t\t\t\tdoc.updatedAt = date;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\tLogs.insertOne({\n\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\ttype: 'document',\n\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, options])) < 200000 ? JSON.stringify([doc, options], null, 2) : 'Too Big',\n\t\t\t\t\tmethod: 'insertOne',\n\t\t\t\t\tid_user: '',\n\t\t\t\t\tuser: '',\n\t\t\t\t\tmessageId: 0,\n\t\t\t\t\troute: ''\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (this.useVersions && !doc.hasOwnProperty('__v')) {\n\t\t\t\tdoc.__v = 0;\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('insertOne', this.collectionName, JSON.stringify([doc, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).insertOne(<OptionalUnlessRequiredId<T>>doc, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\tresolve(doc);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Insert One', this.collectionName, doc, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tlistIndexes(options?: ListIndexesOptions): ListIndexesCursor {\n\t\tlet monitor = new MonitorMongo('listIndexes', this.collectionName, JSON.stringify([options]));\n\t\tlet cursor = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).listIndexes(options);\n\t\tcursor.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn cursor;\n\t}\n\n\trename(newName: string, options?: RenameOptions): Promise<Collection<Document>> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('rename', this.collectionName, JSON.stringify([newName, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).rename(newName, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Rename', this.collectionName, newName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\treplaceOne(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T>, replacement: T, options?: ReplaceOptions, bypassLogs = false, bypassCheckSchema = false, doc: T = null) : Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(replacement);\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - replaceOne', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on replaceOne - ' + this.collectionName, [validation.validationErrors(), replacement]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tlet date = new Date();\n\t\t\t\n\t\t\tif (this.timestamps) {\n\t\t\t\treplacement.updatedAt = date;\n\t\t\t}\n\n\t\t\tif (this.useVersions) {\n\t\t\t\tif (!doc) {\n\t\t\t\t\tdoc = await this.findOne(<any>filter, null, true);\n\t\t\t\t}\n\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.timestamps && !replacement.createdAt && doc.createdAt) {\n\t\t\t\t\t\treplacement.createdAt = doc.createdAt;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (doc.__v === replacement.__v) {\n\t\t\t\t\t\treplacement.__v += 1;\n\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\n\t\t\t\t\t\tif (doc.__v >= 4) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 4}}]});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, replacement, options])) < 200000 ? JSON.stringify([doc, filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tlet monitor = new MonitorMongo('replaceOne', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).replaceOne(<any>filter, replacement, options).then(res => {\n\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, err => {\n\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\tconsole.log(new Date(), 'Error Replace One', this.collectionName, filter, replacement, options, err);\n\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tconsole.log('invalid version - ' + this.collectionName, doc.__v, replacement.__v);\n\n\t\t\t\t\t\tlet prevDoc = await ResolveIOServer.getMongoManager().collection(this.versionCollection).findOne({\n\t\t\t\t\t\t\t_id: <any>{\n\t\t\t\t\t\t\t\t_id: doc._id,\n\t\t\t\t\t\t\t\t__v: replacement.__v\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, null, true);\n\n\t\t\t\t\t\tif (prevDoc) {\n\t\t\t\t\t\t\tlet docId = doc._id;\n\t\t\t\t\t\t\tlet docVersion = doc.__v;\n\t\t\t\t\t\t\tlet updatedDoc: T = getMongoMergeUpdatedDoc(replacement, doc, prevDoc);\n\t\t\t\t\t\t\tupdatedDoc._id = docId;\n\t\t\t\t\t\t\tupdatedDoc.__v = docVersion + 1;\n\n\t\t\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\tid_document: docId,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['invalidVersion - merge', doc, filter, updatedDoc, options])) < 200000 ? JSON.stringify(['invalidVersion - merge', doc, filter, updatedDoc, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tlet monitor = new MonitorMongo('replaceOne', this.collectionName, JSON.stringify([filter, updatedDoc, options]));\n\t\t\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).replaceOne(<any>filter, updatedDoc, options).then(res => {\n\t\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}, err => {\n\t\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\t\tconsole.log(new Date(), 'Error Replace One', this.collectionName, filter, updatedDoc, options, err);\n\t\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject('Invalid Version And Could Not Find History - DB: ' + doc.__v + ', Trying to update with :' + replacement.__v);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (options && options.upsert) {\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\treplacement.createdAt = date;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!replacement._id) {\n\t\t\t\t\t\treplacement._id = objectIdHexString();\n\t\t\t\t\t}\n\n\t\t\t\t\treplacement.__v = 0;\n\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: replacement._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, replacement, options])) < 200000 ? JSON.stringify(['upsert', filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tlet monitor = new MonitorMongo('replaceOne', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).replaceOne(<any>filter, replacement, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Replace One', this.collectionName, filter, replacement, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject('No Document');\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (options && options.upsert) {\n\t\t\t\t\tif (this.timestamps && !replacement.createdAt) {\n\t\t\t\t\t\treplacement.createdAt = date;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!replacement._id) {\n\t\t\t\t\t\treplacement._id = objectIdHexString();\n\t\t\t\t\t}\n\n\t\t\t\t\treplacement.__v = 0;\n\t\t\t\t}\n\n\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\tif (!options) {\n\t\t\t\t\t\toptions = <FindOneAndReplaceOptions>{returnDocument: 'before'};\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t(<FindOneAndReplaceOptions>options).returnDocument = 'before';\n\t\t\t\t\t}\n\n\t\t\t\t\tlet monitor = new MonitorMongo('findOneAndReplace', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndReplace(<any>filter, replacement, <FindOneAndReplaceOptions>options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tlet doc = res;\n\n\t\t\t\t\t\tif (doc) {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, replacement, options])) < 200000 ? JSON.stringify([doc, filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: replacement._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, replacement, options])) < 200000 ? JSON.stringify(['upsert', filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\tresolve(1);\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Find One And Replace', this.collectionName, filter, replacement, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlet monitor = new MonitorMongo('replaceOne', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).replaceOne(<any>filter, replacement, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Replace One', this.collectionName, filter, replacement, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tupdateMany(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T>, update: MongoManagerUpdateFilter<T>, options?: UpdateOptions, bypassLogs = false, bypassCheckSchema = false, bypassVersions = false) : Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif ((!update.$inc || JSON.stringify(update.$inc) === '{}') && (!update.$set || JSON.stringify(update.$set) === '{}') && (!update.$setOnInsert || JSON.stringify(update.$setOnInsert) === '{}') && (!update.$unset || JSON.stringify(update.$unset) === '{}')) {\n\t\t\t\tresolve(1);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tif (this.timestamps) {\n\t\t\t\tlet date = new Date();\n\n\t\t\t\tif (!update.$set) {\n\t\t\t\t\tupdate.$set = <any>{updatedAt: date};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tupdate.$set.updatedAt = date;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(update, {modifier: true});\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - updateMany', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on updateMany - ' + this.collectionName, [validation.validationErrors(), update]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ((this.useVersions && !bypassVersions) || (this.createLogs && !bypassLogs)) {\n\t\t\t\tlet docs = await this.find(filter);\n\t\n\t\t\t\tfor (let i = 0; i < docs.length; i++) {\n\t\t\t\t\tlet doc = docs[i];\n\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, options])) < 200000 ? JSON.stringify([doc, filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'updateMany',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\t\t\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (doc.__v >= 4) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 4}}]});\n\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\tif (!objectContainsPropertyDeep(update, '__v')) {\n\t\t\t\t\t\t\tif (!update.$inc) {\n\t\t\t\t\t\t\t\tupdate.$inc = {__v: 1};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (!update.$inc.__v) {\n\t\t\t\t\t\t\t\tupdate.$inc.__v = 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('updateMany', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).updateMany(<any>filter, update, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Update Many', this.collectionName, filter, update, options, err);\n\t\t\t\treject(err)\n\t\t\t});\n\t\t});\n\t}\n\n\tupdateOne(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T>, update: MongoManagerUpdateFilter<T>, options?: UpdateOptions, bypassLogs = false, bypassCheckSchema = false) : Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\t\t\t\n\t\t\t\tconst isValid = validation.validate(update, {modifier: true});\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - updateOne', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on updateOne - ' + this.collectionName, [validation.validationErrors(), update]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ((!update.$inc || JSON.stringify(update.$inc) === '{}') && (!update.$set || JSON.stringify(update.$set) === '{}') && (!update.$setOnInsert || JSON.stringify(update.$setOnInsert) === '{}') && (!update.$unset || JSON.stringify(update.$unset) === '{}')) {\n\t\t\t\tresolve(1);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet date = new Date();\n\n\t\t\tif (this.timestamps) {\n\t\t\t\tif (!update.$set) {\n\t\t\t\t\tupdate.$set = <any>{updatedAt: date};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tupdate.$set.updatedAt = date;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif (this.useVersions) {\n\t\t\t\tlet doc = await this.findOne(filter, null, true);\n\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, options])) < 200000 ? JSON.stringify([doc, filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\t\n\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t\n\t\t\t\t\tif (doc.__v >= 4) {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 4}}]});\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (!objectContainsPropertyDeep(update, '__v')) {\n\t\t\t\t\t\tif (!update.$inc) {\n\t\t\t\t\t\t\tupdate.$inc = {__v: 1};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (!update.$inc.__v) {\n\t\t\t\t\t\t\tupdate.$inc.__v = 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tlet monitor = new MonitorMongo('updateOne', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).updateOne(<any>filter, update, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Update One', this.collectionName, filter, update, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (options && options.upsert) {\n\t\t\t\t\tif (!update.$setOnInsert) {\n\t\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t__v: 0,\n\t\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t__v: 0\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (!update.$setOnInsert._id) {\n\t\t\t\t\t\t\tupdate.$setOnInsert._id = objectIdHexString();\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif (this.timestamps && !update.$setOnInsert.createdAt) {\n\t\t\t\t\t\t\tupdate.$setOnInsert.createdAt = new Date();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: update.$setOnInsert._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, update, options])) < 200000 ? JSON.stringify(['upsert', filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tlet monitor = new MonitorMongo('updateOne', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).updateOne(<any>filter, update, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Update One', this.collectionName, filter, update, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject('No Document');\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (options && options.upsert) {\n\t\t\t\t\tif (!update.$setOnInsert) {\n\t\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString()\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (!update.$setOnInsert._id) {\n\t\t\t\t\t\t\tupdate.$setOnInsert._id = objectIdHexString();\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif (this.timestamps && !update.$setOnInsert.createdAt) {\n\t\t\t\t\t\t\tupdate.$setOnInsert.createdAt = new Date();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\tif (!options) {\n\t\t\t\t\t\toptions = <FindOneAndUpdateOptions>{returnDocument: 'before'};\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t(<FindOneAndUpdateOptions>options).returnDocument = 'before';\n\t\t\t\t\t}\n\n\t\t\t\t\tlet monitor = new MonitorMongo('findOneAndUpdate', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).findOneAndUpdate(<any>filter, update, <FindOneAndUpdateOptions>options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tlet doc = res.value;\n\n\t\t\t\t\t\tif (doc) {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: <any>doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, options])) < 200000 ? JSON.stringify([doc, filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tresolve(res.ok);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (update.$setOnInsert) {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: update.$setOnInsert._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, update, options])) < 200000 ? JSON.stringify(['upsert', filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\n\t\t\t\t\t\t\tresolve(res.ok);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tresolve(0);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Find One And Update', this.collectionName, filter, update, options, err);\n\t\t\t\t\t\treject(err)\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlet monitor = new MonitorMongo('updateOne', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).updateOne(<any>filter, update, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Update One', this.collectionName, filter, update, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\t\n\twatchCollection(pipeline = [], options?: ChangeStreamOptions): ChangeStream<T> {\n\t\tlet stream = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).watch(pipeline, options);\n\t\treturn <ChangeStream<T>>stream;\n\t}\n}\n\nexport class MongoManagerUserCollection<T extends CollectionDocument> extends MongoManagerCollection<T> {\n\tauthenticate(user: UserModel, password: string): Promise<{data: UserModel, error: string}> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tconst attemptsInterval = Math.pow(100, Math.log(user.attempts + 1));\n\t\t\tconst calculatedInterval = attemptsInterval < 300000 ? attemptsInterval : 300000;\n\t\t\n\t\t\tif (user.last) {\n\t\t\t\tif (Date.now() - user.last.getTime() < calculatedInterval) {\n\t\t\t\t\tuser.last = new Date();\n\t\t\t\t\tawait Users.updateOne({_id: user._id}, {$set: {last: user.last}});\n\t\t\t\t\tresolve({\n\t\t\t\t\t\tdata: null,\n\t\t\t\t\t\terror: 'Attempt Too Soon'\n\t\t\t\t\t});\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tuser.last = new Date();\n\t\t\t}\n\t\t\n\t\t\tif (user.attempts >= 5) {\n\t\t\t\tresolve({\n\t\t\t\t\tdata: null,\n\t\t\t\t\terror: 'Too Many Attempts'\n\t\t\t\t});\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tif (!user.salt) {\n\t\t\t\tresolve({\n\t\t\t\t\tdata: null,\n\t\t\t\t\terror: 'No Salt Value Stored'\n\t\t\t\t});\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tpbkdf2(password, user.salt, {\n\t\t\t\titerations: 25000,\n\t\t\t\tkeylen: 512,\n\t\t\t\tdigestAlgorithm: 'sha256'\n\t\t\t}, async (err, hashBuffer) => {\n\t\t\t\tif (err) {\n\t\t\t\t\treturn reject(err);\n\t\t\t\t}\n\t\t\t\n\t\t\t\tif (scmp(hashBuffer, Buffer.from(user.hash, 'hex'))) {\n\t\t\t\t\tuser.last = new Date();\n\t\t\t\t\tuser.attempts = 0;\n\t\t\t\t\tawait Users.updateOne({_id: user._id}, {$set: {last: user.last, attempts: user.attempts}});\n\n\t\t\t\t\tresolve({\n\t\t\t\t\t\tdata: user,\n\t\t\t\t\t\terror: ''\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tuser.last = new Date();\n\t\t\t\t\tuser.attempts = user.attempts + 1;\n\t\t\t\t\tawait Users.updateOne({_id: user._id}, {$set: {last: user.last, attempts: user.attempts}});\n\n\t\t\t\t\tif (user.attempts >= 5) {\n\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\tdata: null,\n\t\t\t\t\t\t\terror: 'Too Many Attempts'\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\tdata: null,\n\t\t\t\t\t\t\terror: 'Invalid Username And Password'\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t});\n\t\t});\n\t}\n\n\tserializeUser() {\n\t\treturn (user, cb) => {\n\t\t\tcb(null, user.username);\n\t\t};\n\t}\n\n\tdeserializeUser() {\n\t\treturn (username, cb) => {\n\t\t\tUsers.findOne({username: username}).then(res => {\n\t\t\t\tcb(null, res);\n\t\t\t}, err => {\n\t\t\t\tcb(err, null);\n\t\t\t});\n\t\t};\n\t}\n\n\tsetPassword(user: UserModel, password: string) {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!user) {\n\t\t\t\treject('No User');\n\t\t\t}\n\t\t\telse if (!password) {\n\t\t\t\treject('No Password');\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet saltBuffer = await randomBytes(32);\n\t\t\t\tlet salt = saltBuffer.toString('hex');\n\t\t\t\tlet hashRaw = await pbkdf2Promisified(password, salt, {\n\t\t\t\t\titerations: 25000,\n\t\t\t\t\tkeylen: 512,\n\t\t\t\t\tdigestAlgorithm: 'sha256'\n\t\t\t\t});\n\t\t\t\tlet hash = Buffer.from(hashRaw, 'binary').toString('hex');\n\t\t\t\tUsers.updateOne({_id: user._id}, {$set: {hash: hash, salt: salt, services: {}, attempts: 0}}).then(res => resolve(res), rej => reject(rej));\n\t\t\t}\n\t\t});\n\t};\n\n\tchangePassword(user, oldPassword, newPassword) {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!user) {\n\t\t\t\treject('Missing User');\n\t\t\t}\n\t\t\telse if (!oldPassword || !newPassword) {\n\t\t\t\treject('Missing Password');\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet authUser = await this.authenticate(user, oldPassword);\n\n\t\t\t\tif (!authUser['data']) {\n\t\t\t\t\treject(authUser['error']);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.setPassword(user, newPassword).then(res => resolve(res), rej => reject(rej));\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\t\n\tregister(user, password) {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!user.username) {\n\t\t\t\treject('Missing Username');\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet dbUser = await Users.findOne({username: user.username});\n\t\t\t\t\n\t\t\t\tif (dbUser) {\n\t\t\t\t\treject('Username Exists');\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tdbUser = await Users.findOne({email: user.email});\n\n\t\t\t\t\tif (dbUser) {\n\t\t\t\t\t\treject('Email Exists');\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tuser.setPassword(password);\n\t\t\t\t\t\tresolve(user);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tresetAttempts(user: UserModel) {\n\t\treturn Users.updateOne({_id: user._id}, {$set: {attempts: 0}});\n\t}\n}\n\nexport function objectIdHexString() {\n\tlet objectId = new ObjectId();\n\treturn objectId.toHexString();\n}\n\nfunction pbkdf2(password, salt, options, callback) {\n\tcrypto.pbkdf2(password, salt, options.iterations, options.keylen, options.digestAlgorithm, callback);\n};\n\nfunction pbkdf2Promisified(password, salt, options): Promise<any> {\n\treturn new Promise((resolve, reject) => pbkdf2(password, salt, options, (err, hashRaw) => (err ? reject(err) : resolve(hashRaw))));\n}\n\nfunction randomBytes(saltlen): Promise<Buffer> {\n\treturn new Promise((resolve, reject) => crypto.randomBytes(saltlen, (err, saltBuffer) => (err ? reject(err) : resolve(saltBuffer))));\n}\n\nfunction objectContainsPropertyDeep(obj: Object, prop: string) {\n\tlet keys = Object.keys(obj);\n\n\tif (keys.some(a => a === prop)) {\n\t\treturn true;\n\t}\n\t\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tlet key = keys[i];\n\t\tif (obj[key] && typeof obj[key] === 'object' && objectContainsPropertyDeep(obj[key], prop)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}"]}
1
+ {"version":3,"sources":["../../src/managers/mongo.manager.ts"],"names":["simpl_schema_1","require","mongodb_1","index_1","user_collection_1","common_1","log_collection_1","NodeCache","crypto","scmp","monitor_manager_1","os_1","numCPUs","cpus","length","v8","async_1","MongoManager","serverConfig","this","_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","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","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","op","changeStream","getMongoConnection","db","watch","on","change","__awaiter","coll","err","Date","close","setTimeout","MongoManagerModel","exports","versionOptions","collection_main","collection_version","MongoManagerUserCollection","MongoManagerCollection","useVersionCollection","useVersions","versionSchema","deepCopy","schema","_id","blackbox","useReportBuilder","reportBuilderLookupTables","timestamps","createLogs","checkSchema","createIndex","_id._id","_id.__v","versionCollection","schemaCopy","interval","simplschema","rbSchema","useRB","default","buildRbLookups","buildRbSchema","setInterval","getMainServer","getMongoManager","clearInterval","extractIndexNameFromError","errorMessage","matches","match","skipCache","Promise","resolve","reject","monitor_1","res","aggregateCount","aggregateCursor","cursor","ev","aggregateStream","streamOptions","stream","bulkWrite","operations","bypassLogs","bypassCheckSchema","logs","versionOps","deleteOldVersionsOps","bulkOps","updateFilters","updateManyFilters","deleteManyFilters","forEach","opType","Object","$or","_b","_d","currentDocs","getNestedValue","doc","split","reduce","acc","part","Array","isArray","map","item","val","findMatchingDocs","matchDocument","every","docValue","subFilter","evaluateCondition","condition","$in","$nin","$ne","$gt","$gte","$lt","$lte","$exists","RegExp","$regex","$options","test","date","document","objectIdHexString","this_1","hasOwnProperty","__v","createdAt","updatedAt","validation","newContext","validate","validationErrors","getMethodManager","callMethodInternal","call","insertOne","id_document","payload","method","id_user","user","messageId","route","matchingDocs","e_4","matchingDocs_1","matchingDocs_1_1","currentDoc","$set","modifier","versionDoc","objectContainsPropertyDeep","$inc","deleteMany","upsert","$setOnInsert","replacement","e_5","matchingDocs_2","matchingDocs_2_1","e_6","matchingDocs_3","matchingDocs_3_1","operations_1","operations_1_1","slice","mainResult","Logs","err_1","countDocuments","create","f_docs","insertMany","fieldOrSpec","indexQueue","action","specs","createIndexes","indexSpecs","docs","i","replaceOne","$and","acknowledged","deletedCount","deleteOne","monitor_2","findOneAndDelete","returnVal","monitor_3","distinct","drop","dropIndex","indexName","dropIndexes","monitor_4","findById","id","findCount","count","findCursor","removeAllListeners","findStream","monitor_5","findOneAndReplace","findOneAndUpdate","indexes","indexExists","bypassMonitor","validationResults","validDocs","idx","monitor_6","listIndexes","rename","newName","monitor_7","modifiedCount","prevDoc","docId","docVersion","updatedDoc_1","getMongoMergeUpdatedDoc","monitor_8","monitor_9","returnDocument","monitor_10","monitor_11","updateMany","bypassVersions","$unset","updateOne","monitor_12","monitor_13","monitor_14","ok","monitor_15","watchCollection","queue","task","callback","dbCollection","apply","code","err_2","message","existingIndexName","innerError_1","Error","concat","_super","__extends","authenticate","password","attemptsInterval","Math","pow","attempts","calculatedInterval","last","now","getTime","Users","salt","pbkdf2","iterations","keylen","digestAlgorithm","hashBuffer","Buffer","hash","serializeUser","cb","username","deserializeUser","setPassword","randomBytes","saltBuffer","toString","pbkdf2Promisified","hashRaw","services","rej","changePassword","oldPassword","newPassword","authUser","register","email","resetAttempts","ObjectId","toHexString","saltlen","obj","prop"],"mappings":"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","file":"mongo.manager.js","sourcesContent":["import SimpleSchema from 'simpl-schema';\nimport { AggregateOptions, AggregationCursor, BulkWriteOptions, ChangeStream, ChangeStreamOptions, CommandOperationOptions, CountDocumentsOptions, CreateCollectionOptions, CreateIndexesOptions, CursorStreamOptions, DeleteOptions, Filter, FindCursor, FindOneAndDeleteOptions, FindOneAndReplaceOptions, FindOneAndUpdateOptions, FindOptions, IndexDescription, IndexInformationOptions, InsertOneOptions, ListIndexesCursor, ListIndexesOptions, ObjectId, RenameOptions, ReplaceOptions, UpdateOptions, OptionalId, Collection, CollectionInfo, OptionalUnlessRequiredId, AnyBulkWriteOperation, BulkWriteResult, DbStatsOptions } from 'mongodb';\nimport { LookupTables } from '../models/report-builder.model';\nimport { ResolveIOServer } from '../index';\nimport { Users } from '../collections/user.collection';\nimport { buildRbLookups, buildRbSchema, dateReviver, deepCopy, getBinarySize, getMongoMergeUpdatedDoc } from '../util/common';\nimport { UserModel } from '../models/user.model';\nimport { Logs } from '../collections/log.collection';\nimport * as NodeCache from 'node-cache';\nconst crypto = require('crypto');\nconst scmp = require('scmp');\nimport { MonitorMongo } from './monitor.manager';\nimport { CollectionDocument, Document } from '../models/collection-document.model';\nimport { cpus } from 'os';\nconst numCPUs = cpus().length;\nconst v8 = require('v8');\nimport async from 'async';\n\ninterface MongoQueueModel {\n\t_id: number,\n\tname_collection: string;\n\tlookup_collections: string[];\n\tname_function: string;\n\tdata_function: any[];\n\tname_function_addt: string;\n\tdata_function_addt: any[];\n\tcbs: Function[];\n\tcbs_next: Function[];\n\trunning: boolean;\n\tcacheId: number;\n\tinvalidateFlag: boolean;\n\tinvalidateCount: number;\n}\n\n// export declare interface MongoManagerFilterOperators<T> extends Document {\nexport declare interface MongoManagerFilterParamaterOperators<P> {\n\t$eq?: P;\n $gt?: P;\n $gte?: P;\n $in?: P extends Array<any> ? P : P[];\n $lt?: P;\n $lte?: P;\n $ne?: P;\n $nin?: P extends Array<any> ? P : P[];\n $not?: P extends string ? MongoManagerFilterParamaterOperators<P> | RegExpConstructor : MongoManagerFilterParamaterOperators<P>;\n $exists?: boolean;\n $expr?: any[]\n $regex?: P extends string ? RegExpConstructor | string : never;\n $options?: P extends string ? string : never;\n $geoIntersects?: {\n $geometry: Document;\n };\n $geoWithin?: Document;\n $near?: Document;\n $nearSphere?: Document;\n $maxDistance?: number;\n $all?: any[];\n $elemMatch?: Document;\n $size?: P extends any[] ? number : never;\n}\n\nexport declare interface MongoManagerFilterOperators<T> extends Document { //TODO: Remove extends document when I get answer on S.O.\n $and?: MongoManagerFilter<T>[] | MongoManagerFilterOperators<T>;\n $nor?: MongoManagerFilter<T>[] | MongoManagerFilterOperators<T>;\n $or?: MongoManagerFilter<T>[] | MongoManagerFilterOperators<T>;\n $text?: {\n $search: string;\n $language?: string;\n $caseSensitive?: boolean;\n $diacriticSensitive?: boolean;\n };\n $where?: string | ((this: T) => boolean);\n $comment?: string | Document;\n}\n\n// function isDotStringRegExp(obj: Object, dotKey: string): boolean {\n// \tlet keyData = dotKey.split('.');\n// \tlet objData = obj;\n\t\n// \tfor (let i = 0; i < keyData.length; i++) {\n// \t\tlet key = keyData[i];\n// \t\tif (objData.hasOwnProperty(key)) {\n// \t\t\tobjData = objData[key];\n\t\t\t\n// \t\t\tif (i === keyData.length - 1) {\n// \t\t\t\treturn true;\n// \t\t\t}\n// \t\t}\n// \t\telse {\n// \t\t\treturn false;\n// \t\t}\n// \t}\n// }\n\n// export declare type MongoManagerDotStringFilter<T> = {\n// \t[key: string]: (isDotStringRegExp(T, key) ? any : never);\n// };\n\nexport declare type MongoManagerFilter<T> = {\n\t[P in keyof T]?: T[P] | MongoManagerFilterParamaterOperators<T[P]>;\n};\n\nexport declare type MongoManagerUnsetFilter<T> = {\n\t[P in keyof T]?: number | boolean;\n};\n\nexport declare type MongoManagerIncFilter<T> = {\n\t[P in keyof T]?: number;\n};\n\nexport declare type MongoManagerUpdateFilter<T> = {\n $inc?: MongoManagerIncFilter<T> | Document;\n $set?: MongoManagerFilter<T> | Document;\n $setOnInsert?: MongoManagerFilter<T> | Document;\n $unset?: MongoManagerUnsetFilter<T> | Document;\n};\n\nexport class MongoManager {\n\tprivate _collections: MongoManagerCollection<CollectionDocument>[] = [];\n\tprivate _nodeCache;\n\tprivate _cacheMap: { 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\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\tconst op = this._operationInProgress.get(cacheKey);\n\t\t\treturn op.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 monitor = new MonitorMongo('find', collectionName, JSON.stringify([filter, options]));\n\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\n\t\tdo {\n\t\t\tconst op = this._operationInProgress.get(cacheKey);\n\t\t\top.invalidatedDuringExecution = false; // Reset before query\n\t\t\tresult = await collection.find(<any>filter, options).toArray();\n\t\t} while (this._operationInProgress.get(cacheKey).invalidatedDuringExecution); // Re-run if invalidated\n\n\t\tmonitor.finish();\n\n\t\tthis.addToCache([collectionName], cacheKey, result);\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\tconst op = this._operationInProgress.get(cacheKey);\n\t\t\treturn op.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 monitor = new MonitorMongo('findOne', collectionName, JSON.stringify([filter, options]));\n\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\n\t\tdo {\n\t\t\tconst op = this._operationInProgress.get(cacheKey);\n\t\t\top.invalidatedDuringExecution = false;\n\t\t\tresult = await collection.findOne(<any>filter, options);\n\t\t} while (this._operationInProgress.get(cacheKey).invalidatedDuringExecution);\n\t\t\n\t\tmonitor.finish();\n\n\t\tthis.addToCache([collectionName], cacheKey, result);\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\tconst op = this._operationInProgress.get(cacheKey);\n\t\t\treturn op.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 monitor = new MonitorMongo('aggregate', collectionName, JSON.stringify([pipeline, options]));\n\t\tconst collection = ResolveIOServer.getMainDB().collection<T>(collectionName);\n\n\t\tdo {\n\t\t\tconst op = this._operationInProgress.get(cacheKey);\n\t\t\top.invalidatedDuringExecution = false;\n\t\t\tresult = await collection.aggregate(pipeline, options).toArray();\n\t\t} while (this._operationInProgress.get(cacheKey).invalidatedDuringExecution);\n\t\t\n\t\tmonitor.finish();\n\n\t\tthis.addToCache(collections, cacheKey, result);\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\tconst op = this._operationInProgress.get(cacheMap.key);\n\t\t\tif (op) {\n\t\t\t\top.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.getMongoConnection().db(this._serverConfig['DATABASE']);\n\t\tconst changeStream = db.watch();\n\n\t\tchangeStream.on('change', async change => {\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 const { action, collection, specs, options } = task;\n \n const dbCollection = ResolveIOServer.getMainDB().collection(collection.collectionName, collection.collectionOptions);\n \n if (!dbCollection) {\n return callback(new Error(`Collection ${collection.collectionName} not found`));\n }\n\n let monitor = new MonitorMongo(action, collection.collectionName, JSON.stringify([specs, options]));\n\n const createIndex = async () => {\n try {\n const result = await dbCollection[action](...specs, options);\n monitor.finish();\n callback(null, result);\n } catch (err) {\n if (err.code === 85 || err.message.includes('IndexOptionsConflict')) {\n try {\n const existingIndexName = collection.extractIndexNameFromError(err.message);\n if (existingIndexName) {\n await dbCollection.dropIndex(existingIndexName);\n return await createIndex();\n }\n } catch (innerError) {\n callback(innerError);\n }\n }\n monitor.finish();\n callback(err);\n }\n };\n\n await createIndex();\n }, 1);\n\n // Method to extract index name from error message\n extractIndexNameFromError(errorMessage) {\n\t\tlet regexPattern = /Index already exists with a different name: (\\S+)/;\n\t\tlet matches = errorMessage.match(regexPattern);\n\t\n\t\tif (!matches || matches.length <= 1) {\n\t\t\t// If the first pattern doesn't match, try the second pattern\n\t\t\tregexPattern = /existing index:.*name: \"([^\"]+)\"/;\n\t\t\tmatches = errorMessage.match(regexPattern);\n\t\t}\n\t\n\t\treturn matches && matches.length > 1 ? matches[1] : null;\n\t}\t\n\n\taggregate(pipeline: object[], options?: AggregateOptions, skipCache = false) : Promise<any[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tif (!skipCache) {\n\t\t\t\tResolveIOServer.getMongoManager().aggregate(this.collectionName, pipeline, options).then(res => {\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet monitor = new MonitorMongo('aggregate', this.collectionName, JSON.stringify([pipeline, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options).toArray().then(res => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Aggregate', this.collectionName, pipeline, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tasync aggregateCount(pipeline: object[], options?: AggregateOptions) : Promise<number> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('aggregateCount', this.collectionName, JSON.stringify([pipeline, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options).toArray().then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res.length);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Aggregate', this.collectionName, pipeline, options, err);\n\t\t\t\treject(0);\n\t\t\t});\n\t\t});\n\t}\n\n\taggregateCursor(pipeline: object[], options?: AggregateOptions): AggregationCursor {\n\t\tlet monitor = new MonitorMongo('aggregateCursor', this.collectionName, JSON.stringify([pipeline, options]));\n\t\tlet cursor = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options);\n\t\tcursor.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn cursor;\n\t}\n\n\taggregateStream(pipeline: object[], options?: AggregateOptions, streamOptions?: CursorStreamOptions) {\n\t\tlet monitor = new MonitorMongo('aggregateStream', this.collectionName, JSON.stringify([pipeline, options, streamOptions]));\n\t\tlet stream = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).aggregate(pipeline, options).stream(streamOptions);\n\t\tstream.on('end', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('error', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn stream;\n\t}\n\n\t// bulkWrite(operations: AnyBulkWriteOperation<T>[], options: BulkWriteOptions): Promise<BulkWriteResult> {\n\tbulkWrite(operations: any[], options?: BulkWriteOptions, bypassLogs = false, bypassCheckSchema = false): Promise<BulkWriteResult> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!operations.length) {\n\t\t\t\tresolve(null);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst logs = [];\n\t\t\tconst versionOps = []; // For storing versioning ops\n\t\t\tconst deleteOldVersionsOps = []; // For deleteMany operations to remove older versions\n\t\t\tconst bulkOps = [];\n\t\t\tconst updateFilters = [];\n\t\t\tconst updateManyFilters = [];\n\t\t\tconst deleteManyFilters = [];\n\t\n\t\t\t// Collect filters for all operations\n\t\t\toperations.forEach(op => {\n\t\t\t\tconst opType = Object.keys(op)[0];\n\t\t\t\tif (opType === 'updateOne' || opType === 'deleteOne' || opType === 'replaceOne') {\n\t\t\t\t\tupdateFilters.push(op[opType].filter); // Store filters for updateOne, deleteOne, and replaceOne\n\t\t\t\t}\n\t\t\t\telse if (opType === 'updateMany') {\n\t\t\t\t\tupdateManyFilters.push(op[opType].filter); // Store the entire filter for updateMany\n\t\t\t\t}\n\t\t\t\telse if (opType === 'deleteMany') {\n\t\t\t\t\tdeleteManyFilters.push(op[opType].filter); // Store the entire filter for deleteMany\n\t\t\t\t}\n\t\t\t});\n\t\n\t\t\t// Pre-fetch all documents based on the filters before proceeding with the bulk operations\n\t\t\tconst currentDocs = updateFilters.length || updateManyFilters.length || deleteManyFilters.length\n\t\t\t\t? await this.find(<any>{ $or: [...updateFilters, ...updateManyFilters, ...deleteManyFilters] })\n\t\t\t\t: [];\n\n\t\t\t// Helper function to get the value from a document using a dot-notated key (e.g., 'obj.property')\n\t\t\t// This will also handle arrays of objects (e.g., 'obj.arrayOfObjects.property')\n\t\t\tconst getNestedValue = (doc, key) => {\n\t\t\t\tconst parts = key.split('.');\n\n\t\t\t\treturn parts.reduce((acc, part) => {\n\t\t\t\t\tif (Array.isArray(acc)) {\n\t\t\t\t\t\t// If we're dealing with an array, return an array of values for each element\n\t\t\t\t\t\treturn acc.map(item => item[part]).filter(val => val !== undefined);\n\t\t\t\t\t}\n\t\t\t\t\treturn acc && acc[part];\n\t\t\t\t}, doc);\n\t\t\t};\n\t\n\t\t\t// Helper function to locally find matching documents based on filter\n\t\t\tconst findMatchingDocs = (filter) => {\n\t\t\t\treturn currentDocs.filter(doc => {\n\t\t\t\t\treturn matchDocument(filter, doc);\n\t\t\t\t});\n\t\t\t};\n\n\t\t\tconst matchDocument = (filter, doc) => {\n\t\t\t\treturn Object.keys(filter).every(key => {\n\t\t\t\t\tconst value = filter[key];\n\t\t\t\t\tconst docValue = getNestedValue(doc, key); // Get nested value from the document\n\t\t\t\n\t\t\t\t\t// Handle logical operators\n\t\t\t\t\tif (key === '$and') {\n\t\t\t\t\t\treturn value.every(subFilter => matchDocument(subFilter, doc));\n\t\t\t\t\t}\n\t\t\t\n\t\t\t\t\tif (key === '$or') {\n\t\t\t\t\t\treturn value.some(subFilter => matchDocument(subFilter, doc));\n\t\t\t\t\t}\n\t\t\t\n\t\t\t\t\t// If docValue is an array, apply filter conditions to each element\n\t\t\t\t\tif (Array.isArray(docValue)) {\n\t\t\t\t\t\treturn docValue.some(val => evaluateCondition(value, val));\n\t\t\t\t\t}\n\t\t\t\n\t\t\t\t\t// Otherwise, apply the condition to the single value\n\t\t\t\t\treturn evaluateCondition(value, docValue);\n\t\t\t\t});\n\t\t\t};\n\t\t\t\n\t\t\t// Helper function to evaluate the condition (value) against the document value (docValue)\n\t\t\tconst evaluateCondition = (condition, docValue) => {\n\t\t\t\t// If condition is an object, handle operators like $in, $nin, $ne, etc.\n\t\t\t\tif (condition instanceof Object) {\n\t\t\t\t\tif ('$in' in condition) {\n\t\t\t\t\t\treturn condition.$in.includes(docValue);\n\t\t\t\t\t}\n\t\t\t\t\tif ('$nin' in condition) {\n\t\t\t\t\t\treturn !condition.$nin.includes(docValue);\n\t\t\t\t\t}\n\t\t\t\t\tif ('$ne' in condition) {\n\t\t\t\t\t\treturn docValue !== condition.$ne;\n\t\t\t\t\t}\n\t\t\t\t\tif ('$gt' in condition) {\n\t\t\t\t\t\treturn docValue > condition.$gt;\n\t\t\t\t\t}\n\t\t\t\t\tif ('$gte' in condition) {\n\t\t\t\t\t\treturn docValue >= condition.$gte;\n\t\t\t\t\t}\n\t\t\t\t\tif ('$lt' in condition) {\n\t\t\t\t\t\treturn docValue < condition.$lt;\n\t\t\t\t\t}\n\t\t\t\t\tif ('$lte' in condition) {\n\t\t\t\t\t\treturn docValue <= condition.$lte;\n\t\t\t\t\t}\n\t\t\t\t\tif ('$exists' in condition) {\n\t\t\t\t\t\treturn (docValue !== undefined) === condition.$exists;\n\t\t\t\t\t}\n\t\t\t\t\tif ('$regex' in condition) {\n\t\t\t\t\t\tconst regex = new RegExp(condition.$regex, condition.$options || '');\n\t\t\t\t\t\treturn regex.test(docValue);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\n\t\t\t\t// Handle regular equality comparison\n\t\t\t\treturn docValue === condition;\n\t\t\t};\n\t\n\t\t\tfor (const op of operations) {\n\t\t\t\tconst opType = Object.keys(op)[0];\n\t\t\t\tlet doc = op[opType];\n\t\n\t\t\t\tif (opType === 'insertOne') {\n\t\t\t\t\t// Ensure _id and __v for insertOne operations\n\t\t\t\t\tif (!doc.document._id) {\n\t\t\t\t\t\tdoc.document._id = objectIdHexString();\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (this.useVersions && !doc.document.hasOwnProperty('__v')) {\n\t\t\t\t\t\tdoc.document.__v = 0;\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tlet date = new Date();\n\n\t\t\t\t\t\tif (!doc.document.createdAt) {\n\t\t\t\t\t\t\tdoc.document.createdAt = date;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!doc.document.updatedAt) {\n\t\t\t\t\t\t\tdoc.document.updatedAt = date;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\t\tconst isValid = validation.validate(doc.document);\n\t\t\n\t\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - bulkWrite - insertOne', validation.validationErrors());\n\t\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on bulkWrite insertOne - ' + this.collectionName, [validation.validationErrors(), doc.document]);\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t// Log the operation\n\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\tid_document: doc.document._id,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options])) < 200000 ? JSON.stringify([op, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\n\t\t\t\t\tbulkOps.push(op); // Add insertOne operation to bulkOps\n\t\t\t\t} \n\t\t\t\telse if (opType === 'updateOne') {\t\n\t\t\t\t\t// Find all matching documents locally based on filter\n\t\t\t\t\tconst matchingDocs = findMatchingDocs(doc.filter);\n\t\n\t\t\t\t\tif (matchingDocs.length) {\n\t\t\t\t\t\tfor (let currentDoc of matchingDocs) {\n\t\t\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\t\t\tif (doc.update.$set) {\n\t\t\t\t\t\t\t\t\tdoc.update.$set.updatedAt = new Date();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\tdoc.update.$set = { updatedAt: new Date() };\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\t\t\t\tconst isValid = validation.validate(doc.update, {modifier: true});\n\t\t\t\t\n\t\t\t\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - bulkWrite - updateOne', validation.validationErrors());\n\t\t\t\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on bulkWrite updateOne - ' + this.collectionName, [validation.validationErrors(), doc.update, currentDoc]);\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\t\tlet versionDoc = deepCopy(currentDoc);\n\n\t\t\t\t\t\t\t\tversionDoc._id = <any>{_id: versionDoc._id, __v: versionDoc.__v};\n\n\t\t\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\t\tdocument: versionDoc\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\n\t\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.update, '__v')) {\n\t\t\t\t\t\t\t\t\tif (!doc.update.$inc) {\n\t\t\t\t\t\t\t\t\t\tdoc.update.$inc = { __v: 1 };\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\tdoc.update.$inc.__v = 1;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\t\t// Delete old versions if __v >= 4\n\t\t\t\t\t\t\t\tif (versionDoc.__v >= 4) {\n\t\t\t\t\t\t\t\t\tdeleteOldVersionsOps.push({\n\t\t\t\t\t\t\t\t\t\tdeleteMany: {\n\t\t\t\t\t\t\t\t\t\t\tfilter: {\n\t\t\t\t\t\t\t\t\t\t\t\t'_id._id': versionDoc._id._id,\n\t\t\t\t\t\t\t\t\t\t\t\t'_id.__v': { $lt: versionDoc.__v - 4 }\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\t\tid_document: currentDoc._id,\n\t\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options, currentDoc])) < 200000 ? JSON.stringify([op, options, currentDoc], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\tbulkOps.push(op); // Add updateOne or replaceOne operation to bulkOps\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (doc.upsert) {\n\t\t\t\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\t\t\t\tconst isValid = validation.validate(doc.update, {modifier: true});\n\t\t\t\t\n\t\t\t\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - bulkWrite - updateOne', validation.validationErrors());\n\t\t\t\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on bulkWrite updateOne - ' + this.collectionName, [validation.validationErrors(), doc.update]);\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.update, '_id')) {\n\t\t\t\t\t\t\t\tdoc.update.$setOnInsert._id = objectIdHexString();\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.update, '__v')) {\n\t\t\t\t\t\t\t\t\tdoc.update.$setOnInsert.__v = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n \n\t\t\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.update, 'createdAt')) {\n\t\t\t\t\t\t\t\t\tdoc.update.$setOnInsert.createdAt = new Date();\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.update, 'updatedAt')) {\n\t\t\t\t\t\t\t\t\tdoc.update.$setOnInsert.updatedAt = new Date();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\t\tid_document: doc.update.$setOnInsert._id,\n\t\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options, doc.update])) < 200000 ? JSON.stringify([op, options, doc.update], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\tbulkOps.push(op); // Add updateOne or replaceOne operation to bulkOps\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (opType === 'replaceOne') {\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tdoc.replacement.updatedAt = new Date();\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Find all matching documents locally based on filter\n\t\t\t\t\tconst matchingDocs = findMatchingDocs(doc.filter);\n\t\n\t\t\t\t\tif (matchingDocs.length) {\n\t\t\t\t\t\tfor (let currentDoc of matchingDocs) {\n\t\t\t\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\t\t\t\tconst isValid = validation.validate(doc.replacement);\n\t\t\t\t\n\t\t\t\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - bulkWrite - insertOne', validation.validationErrors());\n\t\t\t\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on bulkWrite replaceOne - ' + this.collectionName, [validation.validationErrors(), doc.replacement]);\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\t\tlet versionDoc = deepCopy(currentDoc);\n\n\t\t\t\t\t\t\t\tversionDoc._id = <any>{_id: versionDoc._id, __v: versionDoc.__v};\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\t\tdocument: versionDoc\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\n\t\t\t\t\t\t\t\tdoc.replacement.__v = versionDoc.__v + 1;\n\t\t\n\t\t\t\t\t\t\t\t// Delete old versions if __v >= 4\n\t\t\t\t\t\t\t\tif (versionDoc.__v >= 4) {\n\t\t\t\t\t\t\t\t\tdeleteOldVersionsOps.push({\n\t\t\t\t\t\t\t\t\t\tdeleteMany: {\n\t\t\t\t\t\t\t\t\t\t\tfilter: {\n\t\t\t\t\t\t\t\t\t\t\t\t'_id._id': versionDoc._id._id,\n\t\t\t\t\t\t\t\t\t\t\t\t'_id.__v': { $lt: versionDoc.__v - 4 }\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\t\tid_document: currentDoc._id,\n\t\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options, currentDoc])) < 200000 ? JSON.stringify([op, options, currentDoc], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\tbulkOps.push(op); // Add updateOne or replaceOne operation to bulkOps\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (doc.upsert) {\n\t\t\t\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\t\t\t\tconst isValid = validation.validate(doc.replacement);\n\t\t\t\t\n\t\t\t\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - bulkWrite - replaceOne', validation.validationErrors());\n\t\t\t\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on bulkWrite replaceOne - ' + this.collectionName, [validation.validationErrors(), doc.replacement]);\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.replacement, '_id')) {\n\t\t\t\t\t\t\t\tdoc.replacement._id = objectIdHexString();\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.replacement, '__v')) {\n\t\t\t\t\t\t\t\t\tdoc.replacement.__v = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n \n\t\t\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.replacement, 'createdAt')) {\n\t\t\t\t\t\t\t\t\tdoc.replacement.createdAt = new Date();\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.replacement, 'updatedAt')) {\n\t\t\t\t\t\t\t\t\tdoc.replacement.updatedAt = new Date();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\t\tid_document: doc.replacement._id,\n\t\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options, doc.replacement])) < 200000 ? JSON.stringify([op, options, doc.replacement], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\tbulkOps.push(op); // Add updateOne or replaceOne operation to bulkOps\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (opType === 'deleteOne') {\n\t\t\t\t\t// Find all matching documents locally based on filter\n\t\t\t\t\tconst matchingDocs = findMatchingDocs(doc.filter);\n\t\t\t\t\t\n\t\t\t\t\tmatchingDocs.forEach(currentDoc => {\n\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\tlet versionDoc = deepCopy(currentDoc);\n\n\t\t\t\t\t\t\tversionDoc._id = <any>{_id: versionDoc._id, __v: versionDoc.__v};\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: versionDoc\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\n\t\t\t\t\t\t\t// Delete old versions if __v >= 4\n\t\t\t\t\t\t\tif (versionDoc.__v >= 4) {\n\t\t\t\t\t\t\t\tdeleteOldVersionsOps.push({\n\t\t\t\t\t\t\t\t\tdeleteMany: {\n\t\t\t\t\t\t\t\t\t\tfilter: {\n\t\t\t\t\t\t\t\t\t\t\t'_id._id': versionDoc._id._id,\n\t\t\t\t\t\t\t\t\t\t\t'_id.__v': { $lt: versionDoc.__v - 4 }\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\tid_document: currentDoc._id,\n\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options, currentDoc])) < 200000 ? JSON.stringify([op, options, currentDoc], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tbulkOps.push(op); // Add deleteOne operation to bulkOps\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (opType === 'updateMany') {\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tif (doc.update.$set) {\n\t\t\t\t\t\t\tdoc.update.$set.updatedAt = new Date();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdoc.update.$set = {\n\t\t\t\t\t\t\t\tupdatedAt: new Date()\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tif (!objectContainsPropertyDeep(doc.update, '__v')) {\n\t\t\t\t\t\t\tif (!doc.update.$inc) {\n\t\t\t\t\t\t\t\tdoc.update.$inc = { __v: 1 };\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tdoc.update.$inc.__v = 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Process all documents matching the updateMany filter locally\n\t\t\t\t\tconst matchingDocs = findMatchingDocs(doc.filter);\n\t\n\t\t\t\t\tfor (let currentDoc of matchingDocs) {\n\t\t\t\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\t\t\tconst isValid = validation.validate(doc.update, {modifier: true});\n\t\t\t\n\t\t\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - bulkWrite - insertOne', validation.validationErrors());\n\t\t\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on bulkWrite updateMany - ' + this.collectionName, [validation.validationErrors(), doc.update]);\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\tlet versionDoc = deepCopy(currentDoc);\n\n\t\t\t\t\t\t\tversionDoc._id = <any>{_id: versionDoc._id, __v: versionDoc.__v};\n\n\t\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: versionDoc\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\n\t\t\t\t\t\t\t// Delete old versions if __v >= 4\n\t\t\t\t\t\t\tif (versionDoc.__v >= 4) {\n\t\t\t\t\t\t\t\tdeleteOldVersionsOps.push({\n\t\t\t\t\t\t\t\t\tdeleteMany: {\n\t\t\t\t\t\t\t\t\t\tfilter: {\n\t\t\t\t\t\t\t\t\t\t\t'_id._id': versionDoc._id._id,\n\t\t\t\t\t\t\t\t\t\t\t'_id.__v': { $lt: versionDoc.__v - 4 }\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\tid_document: currentDoc._id,\n\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options])) < 200000 ? JSON.stringify([op, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tbulkOps.push(op); // Add updateMany operation to bulkOps\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (opType === 'deleteMany') {\n\t\t\t\t\t// Process all documents matching the deleteMany filter locally\n\t\t\t\t\tconst matchingDocs = findMatchingDocs(doc.filter);\n\t\n\t\t\t\t\tmatchingDocs.forEach(currentDoc => {\n\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\tlet versionDoc = deepCopy(currentDoc);\n\n\t\t\t\t\t\t\tversionDoc._id = <any>{_id: versionDoc._id, __v: versionDoc.__v};\n\n\t\t\t\t\t\t\tversionOps.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: versionDoc\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\n\t\t\t\t\t\t\t// Delete old versions if __v >= 4\n\t\t\t\t\t\t\tif (versionDoc.__v >= 4) {\n\t\t\t\t\t\t\t\tdeleteOldVersionsOps.push({\n\t\t\t\t\t\t\t\t\tdeleteMany: {\n\t\t\t\t\t\t\t\t\t\tfilter: {\n\t\t\t\t\t\t\t\t\t\t\t'_id._id': versionDoc._id._id,\n\t\t\t\t\t\t\t\t\t\t\t'_id.__v': { $lt: versionDoc.__v - 4 }\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// Log the operation\n\t\t\t\t\t\tif (!bypassLogs && this.createLogs) {\n\t\t\t\t\t\t\tlogs.push({\n\t\t\t\t\t\t\t\tinsertOne: {\n\t\t\t\t\t\t\t\t\tdocument: {\n\t\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\t\tid_document: currentDoc._id,\n\t\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([op, options])) < 200000 ? JSON.stringify([op, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\t\tmethod: opType,\n\t\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tbulkOps.push(op); // Add deleteMany operation to bulkOps\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\ttry {\n\t\t\t\tif (bulkOps.length) {\n\t\t\t\t\tlet monitor = new MonitorMongo('bulkWrite', this.collectionName, JSON.stringify([bulkOps.slice(-100), options]));\n\t\t\t\t\t\n\t\t\t\t\t// First, perform the main bulk operations on the collection\n\t\t\t\t\tconst mainResult = await ResolveIOServer.getMainDB().collection<T>(this.collectionName).bulkWrite(bulkOps, options);\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\n\t\t\t\t\t// Separate bulkWrite for versions (if any versioning is required)\n\t\t\t\t\tif (versionOps.length || deleteOldVersionsOps.length) {\n\t\t\t\t\t\tawait ResolveIOServer.getMainDB().collection<T>(this.versionCollection).bulkWrite([...versionOps, ...deleteOldVersionsOps]);\n\t\t\t\t\t}\n\t\t\n\t\t\t\t\t// Separate bulkWrite for logs (if logging is enabled)\n\t\t\t\t\tif (!bypassLogs && logs.length) {\n\t\t\t\t\t\tawait Logs.bulkWrite(logs);\n\t\t\t\t\t}\n\t\t\n\t\t\t\t\tmonitor.finish();\n\t\n\t\t\t\t\tresolve(mainResult); // Resolve with the result of the main bulkWrite\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tresolve(null);\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tconsole.log(new Date(), 'Error Bulk Write', this.collectionName, bulkOps.slice(-100), options, err);\n\t\t\t\treject(err);\n\t\t\t}\n\t\t});\n\t}\n\n\tcountDocuments(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: CountDocumentsOptions): Promise<number> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('countDocuments', this.collectionName, JSON.stringify([filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).countDocuments(<any>filter, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Count Documents', this.collectionName, filter, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\t//Helper Function (1 or Many) - Not Real Mongo Function\n\tcreate(f_docs: T | T[], options?: InsertOneOptions | BulkWriteOptions): Promise<T | T[]> {\n\t\tif (!Array.isArray(f_docs)) {\n\t\t\treturn this.insertOne(f_docs, <InsertOneOptions>options);\n\t\t}\n\t\telse if (f_docs.length === 1) {\n\t\t\treturn this.insertOne(f_docs[0], <InsertOneOptions>options);\n\t\t}\n\n\t\treturn this.insertMany(f_docs, <BulkWriteOptions>options);\n\t}\n\n\tcreateIndex(fieldOrSpec: any, options?: CreateIndexesOptions): Promise<string> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tMongoManagerCollection.indexQueue.push({\n\t\t\t\taction: 'createIndex',\n\t\t\t\tcollection: this, // Current instance\n\t\t\t\tspecs: [fieldOrSpec],\n\t\t\t\toptions: options\n\t\t\t}, (err, result) => {\n\t\t\t\tif (err) reject(err);\n\t\t\t\telse resolve(result);\n\t\t\t});\n\t\t});\n\t}\n\t\n\tcreateIndexes(indexSpecs: IndexDescription[], options?: CreateIndexesOptions): Promise<string[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tMongoManagerCollection.indexQueue.push({\n\t\t\t\taction: 'createIndexes',\n\t\t\t\tcollection: this, // Current instance\n\t\t\t\tspecs: [indexSpecs],\n\t\t\t\toptions: options\n\t\t\t}, (err, result) => {\n\t\t\t\tif (err) reject(err);\n\t\t\t\telse resolve(result);\n\t\t\t});\n\t\t});\n\t}\n\n\tdeleteMany(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: DeleteOptions, bypassLogs = false): Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\tlet docs = await this.find(filter);\n\n\t\t\t\tfor (let i = 0; i < docs.length; i++) {\n\t\t\t\t\tlet doc = docs[i];\n\t\t\t\t\n\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, options])) < 200000 ? JSON.stringify([doc, filter, options], null, 2) : 'Too Big',\n\t\t\t\t\t\tmethod: 'deleteMany',\n\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\troute: ''\n\t\t\t\t\t});\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 1}}]});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('deleteMany', this.collectionName, JSON.stringify([filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).deleteMany(<any>filter, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\tresolve(res.deletedCount);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Delete Many', this.collectionName, filter, options, err);\n\t\t\t\treject(err)\n\t\t\t});\n\t\t});\n\t}\n\n\tdeleteOne(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOneAndDeleteOptions, bypassLogs = false): Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\tlet monitor = new MonitorMongo('findOneAndDelete', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndDelete(<any>filter, options).then(async returnVal => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tlet doc = returnVal;\n\n\t\t\t\t\tif (doc) {\n\t\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, options])) < 200000 ? JSON.stringify([doc, filter, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'deleteOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\t\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 1}}]});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\n\t\t\t\t\t\tresolve(1);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tresolve(0);\n\t\t\t\t\t}\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Find One And Delete', this.collectionName, filter, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet monitor = new MonitorMongo('deleteOne', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).deleteOne(<any>filter, options).then(res => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\tresolve(res.deletedCount);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t}\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Delete One', this.collectionName, filter, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\t\t\t\n\t\t});\n\t}\n\n\tdistinct(key: string, filter?: MongoManagerFilter<T> & MongoManagerFilterOperators<T>, options?: CommandOperationOptions): Promise<T[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('distinct', this.collectionName, JSON.stringify([key, filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).distinct(key, <any>filter, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Distinct', this.collectionName, filter, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tdrop(options?: CommandOperationOptions): Promise<boolean> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('drop', this.collectionName, JSON.stringify([options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).drop(options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Count Documents', this.collectionName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tdropIndex(indexName: string, options?: CommandOperationOptions): Promise<Document> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('dropIndex', this.collectionName, JSON.stringify([indexName, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).dropIndex(indexName, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(<Document>res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Drop Index', this.collectionName, indexName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tdropIndexes(options?: CommandOperationOptions): Promise<Boolean> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('dropIndexes', this.collectionName, JSON.stringify([options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).dropIndexes(options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Drop Indexes', this.collectionName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tfind(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>, skipCache = false): Promise<T[]> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!skipCache) {\n\t\t\t\tResolveIOServer.getMongoManager().find(this.collectionName, filter, options).then(res => {\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet monitor = new MonitorMongo('find', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).find<T>(<any>filter, options).toArray().then(res => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Find', this.collectionName, filter, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tfindById(id: string, options?: FindOptions<T>): Promise<T> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('findById', this.collectionName, JSON.stringify([{_id: id}, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOne<T>(<any>{_id: id}, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find By Id', this.collectionName, {_id: id}, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tfindCount(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>): Promise<Number> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('findCount', this.collectionName, JSON.stringify([filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).find(<any>filter, options).count().then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find Count', this.collectionName, filter, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tfindCursor(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>): FindCursor {\n\t\tlet monitor = new MonitorMongo('findCursor', this.collectionName, JSON.stringify([filter, options]));\n\t\tlet cursor = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).find(<any>filter, options);\n\t\tcursor.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\tcursor.removeAllListeners();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn cursor;\n\t}\n\n\tfindStream(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>, streamOptions?: CursorStreamOptions) {\n\t\tlet monitor = new MonitorMongo('findStream', this.collectionName, JSON.stringify([filter, options, streamOptions]));\n\t\tlet stream = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).find(<any>filter, options).stream(streamOptions);\n\t\tstream.on('end', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('error', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t})\n\t\t.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn stream;\n\t}\n\n\tfindOne(filter: MongoManagerFilter<T> | MongoManagerFilterOperators<T> = {}, options?: FindOptions<T>, skipCache = false): Promise<T> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tif (!skipCache) {\n\t\t\t\tResolveIOServer.getMongoManager().findOne(this.collectionName, filter, options).then(res => {\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet monitor = new MonitorMongo('findOne', this.collectionName, JSON.stringify([filter, options]));\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOne<T>(<any>filter, options).then(res => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tresolve(res);\n\t\t\t\t}, err => {\n\t\t\t\t\tmonitor.finish();\n\t\t\t\t\tconsole.log(new Date(), 'Error Find One', this.collectionName, filter, options, err);\n\t\t\t\t\treject(err)\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tfindOneAndDelete(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, options?: FindOneAndDeleteOptions, bypassLogs = false): Promise<T> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('findOneAndDelete', this.collectionName, JSON.stringify([filter, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndDelete(<any>filter, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tlet doc = res;\n\t\t\t\t\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, options])) < 200000 ? JSON.stringify([doc, filter, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'findOneAndDelete',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t}\n\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\n\t\t\t\t\tresolve(<T>doc);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tresolve(null);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find One And Delete', this.collectionName, filter, options, err);\n\t\t\t\treject(err)\n\t\t\t});\n\t\t});\n\t}\n\n\tfindOneAndReplace(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, replacement: T, options?: FindOneAndReplaceOptions, bypassLogs = false, bypassCheckSchema = false): Promise<T> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(replacement);\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - findOneAndReplace', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on findOneAndReplace - ' + this.collectionName, [validation.validationErrors(), replacement]);\n\t\t\t\t\t\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tlet date = new Date();\n\n\t\t\tif (this.timestamps) {\n\t\t\t\treplacement.updatedAt = date;\n\t\t\t}\n\n\t\t\tif (options && options.upsert) {\n\t\t\t\tif (!replacement._id) {\n\t\t\t\t\treplacement._id = objectIdHexString();\n\t\t\t\t}\n\n\t\t\t\tif (this.useVersions) {\n\t\t\t\t\treplacement.__v = 0;\n\t\t\t\t}\n\n\t\t\t\tif (this.timestamps && !replacement.createdAt) {\n\t\t\t\t\treplacement.createdAt = date;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('findOneAndReplace', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndReplace(<any>filter, replacement, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tlet doc = res;\n\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, replacement, options])) < 200000 ? JSON.stringify([doc, filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'findOneAndReplace',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t}\n\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\n\t\t\t\t\tresolve(<T>doc);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tresolve(null);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find One And Replace', this.collectionName, filter, options, err);\n\t\t\t\treject(err)\n\t\t\t});\n\t\t});\n\t}\n\n\tfindOneAndUpdate(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T> = {}, update: MongoManagerUpdateFilter<T>, options?: FindOneAndUpdateOptions, bypassLogs = false, bypassCheckSchema = false): Promise<T> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(update, {modifier: true});\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - findOneAndUpdate', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on findOneAndUpdate - ' + this.collectionName, [validation.validationErrors(), update]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.timestamps) {\n\t\t\t\tlet date = new Date(); \n\t\t\t\t\n\t\t\t\tif (!update.$set) {\n\t\t\t\t\tupdate.$set = <any>{updatedAt: date};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tupdate.$set.updatedAt = date;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (options && options.upsert) {\n\t\t\t\tif (!update.$setOnInsert) {\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t_id: objectIdHexString()\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (!update.$setOnInsert._id) {\n\t\t\t\t\t\tupdate.$setOnInsert._id = objectIdHexString();\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.timestamps && !update.$setOnInsert.createdAt) {\n\t\t\t\t\t\tupdate.$setOnInsert.createdAt = new Date();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('findOneAndUpdate', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndUpdate(<any>filter, <any>update, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tlet doc = res;\n\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\t\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, options])) < 200000 ? JSON.stringify([doc, filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'findOneAndUpdate',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t}\n\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\n\t\t\t\t\tresolve(<T>doc);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tresolve(null);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Find One And Update', this.collectionName, filter, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tindexes(options: IndexInformationOptions): Promise<any[]> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('indexes', this.collectionName, JSON.stringify([options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).indexes(options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Indexes', this.collectionName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tindexExists(indexes: string | string[], options?: IndexInformationOptions): Promise<boolean> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('indexExists', this.collectionName, JSON.stringify([indexes, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).indexExists(indexes, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Index Exists', this.collectionName, indexes, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tinsertMany(docs: T[], options?: BulkWriteOptions, bypassLogs = false, bypassCheckSchema = false, bypassMonitor = false): Promise<T[]> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!docs.length) {\n\t\t\t\tresolve([]);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tlet validationResults = [];\n\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tdocs.forEach(doc => {\n\t\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\t\tconst isValid = validation.validate(doc);\n\n\t\t\t\t\tif (!isValid) {\n\t\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - insertMany', validation.validationErrors());\n\t\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on insertMany - ' + this.collectionName, [validation.validationErrors(), doc]);\n\t\t\t\t\t\tvalidationResults.push(false);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tvalidationResults.push(true);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlet validDocs = this.checkSchema ? docs.filter((a, idx) => validationResults[idx]) : docs;\n\n\t\t\tfor (let i = 0; i < validDocs.length; i++) {\n\t\t\t\tlet doc = validDocs[i];\n\n\t\t\t\tif (!doc._id) {\n\t\t\t\t\tdoc._id = objectIdHexString();\n\t\t\t\t}\n\n\t\t\t\tif (this.timestamps) {\n\t\t\t\t\tlet date = new Date();\n\n\t\t\t\t\tif (!doc.createdAt) {\n\t\t\t\t\t\tdoc.createdAt = date;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!doc.updatedAt) {\n\t\t\t\t\t\tdoc.updatedAt = date;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this.useVersions && !doc.hasOwnProperty('__v')) {\n\t\t\t\t\tdoc.__v = 0;\n\t\t\t\t}\n\n\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, options])) < 200000 ? JSON.stringify([doc, options], null, 2) : 'Too Big',\n\t\t\t\t\t\tmethod: 'insertMany',\n\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\troute: ''\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (validDocs.length) {\n\t\t\t\tlet monitor = null;\n\t\t\t\t\n\t\t\t\tif (!bypassMonitor) {\n\t\t\t\t\tmonitor = new MonitorMongo('insertMany', this.collectionName, JSON.stringify([validDocs, options]));\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).insertMany(<OptionalUnlessRequiredId<T>[]>validDocs, options).then(res => {\n\t\t\t\t\tif (monitor) {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t}\n\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\tresolve(validDocs);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t}\n\t\t\t\t}, err => {\n\t\t\t\t\tif (monitor) {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t}\n\t\t\t\t\tconsole.log(new Date(), 'Error Insert Many', this.collectionName, validDocs, options, err);\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tinsertOne(doc: T, options?: InsertOneOptions, bypassLogs = false, bypassCheckSchema = false): Promise<T> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!doc._id) {\n\t\t\t\tdoc._id = objectIdHexString();\n\t\t\t}\n\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(doc);\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - insertOne', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on insertOne - ' + this.collectionName, [validation.validationErrors(), doc]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.timestamps) {\n\t\t\t\tlet date = new Date();\n\t\t\t\n\t\t\t\tif (!doc.createdAt) {\n\t\t\t\t\tdoc.createdAt = date;\n\t\t\t\t}\n\n\t\t\t\tif (!doc.updatedAt) {\n\t\t\t\t\tdoc.updatedAt = date;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\tLogs.insertOne({\n\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\ttype: 'document',\n\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, options])) < 200000 ? JSON.stringify([doc, options], null, 2) : 'Too Big',\n\t\t\t\t\tmethod: 'insertOne',\n\t\t\t\t\tid_user: '',\n\t\t\t\t\tuser: '',\n\t\t\t\t\tmessageId: 0,\n\t\t\t\t\troute: ''\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (this.useVersions && !doc.hasOwnProperty('__v')) {\n\t\t\t\tdoc.__v = 0;\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('insertOne', this.collectionName, JSON.stringify([doc, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).insertOne(<OptionalUnlessRequiredId<T>>doc, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\tresolve(doc);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Insert One', this.collectionName, doc, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\tlistIndexes(options?: ListIndexesOptions): ListIndexesCursor {\n\t\tlet monitor = new MonitorMongo('listIndexes', this.collectionName, JSON.stringify([options]));\n\t\tlet cursor = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).listIndexes(options);\n\t\tcursor.on('close', ev => {\n\t\t\tmonitor.finish();\n\t\t\treturn ev;\n\t\t});\n\n\t\treturn cursor;\n\t}\n\n\trename(newName: string, options?: RenameOptions): Promise<Collection<Document>> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet monitor = new MonitorMongo('rename', this.collectionName, JSON.stringify([newName, options]));\n\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).rename(newName, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tresolve(res);\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Rename', this.collectionName, newName, options, err);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\treplaceOne(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T>, replacement: T, options?: ReplaceOptions, bypassLogs = false, bypassCheckSchema = false, doc: T = null) : Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(replacement);\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - replaceOne', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on replaceOne - ' + this.collectionName, [validation.validationErrors(), replacement]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tlet date = new Date();\n\t\t\t\n\t\t\tif (this.timestamps) {\n\t\t\t\treplacement.updatedAt = date;\n\t\t\t}\n\n\t\t\tif (this.useVersions) {\n\t\t\t\tif (!doc) {\n\t\t\t\t\tdoc = await this.findOne(<any>filter, null, true);\n\t\t\t\t}\n\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.timestamps && !replacement.createdAt && doc.createdAt) {\n\t\t\t\t\t\treplacement.createdAt = doc.createdAt;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (doc.__v === replacement.__v) {\n\t\t\t\t\t\treplacement.__v += 1;\n\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\n\t\t\t\t\t\tif (doc.__v >= 4) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 4}}]});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, replacement, options])) < 200000 ? JSON.stringify([doc, filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tlet monitor = new MonitorMongo('replaceOne', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).replaceOne(<any>filter, replacement, options).then(res => {\n\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, err => {\n\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\tconsole.log(new Date(), 'Error Replace One', this.collectionName, filter, replacement, options, err);\n\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tconsole.log('invalid version - ' + this.collectionName, doc.__v, replacement.__v);\n\n\t\t\t\t\t\tlet prevDoc = await ResolveIOServer.getMongoManager().collection(this.versionCollection).findOne({\n\t\t\t\t\t\t\t_id: <any>{\n\t\t\t\t\t\t\t\t_id: doc._id,\n\t\t\t\t\t\t\t\t__v: replacement.__v\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, null, true);\n\n\t\t\t\t\t\tif (prevDoc) {\n\t\t\t\t\t\t\tlet docId = doc._id;\n\t\t\t\t\t\t\tlet docVersion = doc.__v;\n\t\t\t\t\t\t\tlet updatedDoc: T = getMongoMergeUpdatedDoc(replacement, doc, prevDoc);\n\t\t\t\t\t\t\tupdatedDoc._id = docId;\n\t\t\t\t\t\t\tupdatedDoc.__v = docVersion + 1;\n\n\t\t\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\t\tid_document: docId,\n\t\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['invalidVersion - merge', doc, filter, updatedDoc, options])) < 200000 ? JSON.stringify(['invalidVersion - merge', doc, filter, updatedDoc, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tlet monitor = new MonitorMongo('replaceOne', this.collectionName, JSON.stringify([filter, updatedDoc, options]));\n\t\t\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).replaceOne(<any>filter, updatedDoc, options).then(res => {\n\t\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}, err => {\n\t\t\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\t\t\tconsole.log(new Date(), 'Error Replace One', this.collectionName, filter, updatedDoc, options, err);\n\t\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject('Invalid Version And Could Not Find History - DB: ' + doc.__v + ', Trying to update with :' + replacement.__v);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (options && options.upsert) {\n\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\treplacement.createdAt = date;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!replacement._id) {\n\t\t\t\t\t\treplacement._id = objectIdHexString();\n\t\t\t\t\t}\n\n\t\t\t\t\treplacement.__v = 0;\n\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: replacement._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, replacement, options])) < 200000 ? JSON.stringify(['upsert', filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tlet monitor = new MonitorMongo('replaceOne', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).replaceOne(<any>filter, replacement, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Replace One', this.collectionName, filter, replacement, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject('No Document');\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (options && options.upsert) {\n\t\t\t\t\tif (this.timestamps && !replacement.createdAt) {\n\t\t\t\t\t\treplacement.createdAt = date;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!replacement._id) {\n\t\t\t\t\t\treplacement._id = objectIdHexString();\n\t\t\t\t\t}\n\n\t\t\t\t\treplacement.__v = 0;\n\t\t\t\t}\n\n\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\tif (!options) {\n\t\t\t\t\t\toptions = <FindOneAndReplaceOptions>{returnDocument: 'before'};\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t(<FindOneAndReplaceOptions>options).returnDocument = 'before';\n\t\t\t\t\t}\n\n\t\t\t\t\tlet monitor = new MonitorMongo('findOneAndReplace', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).findOneAndReplace(<any>filter, replacement, <FindOneAndReplaceOptions>options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tlet doc = res;\n\n\t\t\t\t\t\tif (doc) {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: <string>doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, replacement, options])) < 200000 ? JSON.stringify([doc, filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: replacement._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, replacement, options])) < 200000 ? JSON.stringify(['upsert', filter, replacement, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'replaceOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\tresolve(1);\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Find One And Replace', this.collectionName, filter, replacement, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlet monitor = new MonitorMongo('replaceOne', this.collectionName, JSON.stringify([filter, replacement, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).replaceOne(<any>filter, replacement, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Replace One', this.collectionName, filter, replacement, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tupdateMany(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T>, update: MongoManagerUpdateFilter<T>, options?: UpdateOptions, bypassLogs = false, bypassCheckSchema = false, bypassVersions = false) : Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif ((!update.$inc || JSON.stringify(update.$inc) === '{}') && (!update.$set || JSON.stringify(update.$set) === '{}') && (!update.$setOnInsert || JSON.stringify(update.$setOnInsert) === '{}') && (!update.$unset || JSON.stringify(update.$unset) === '{}')) {\n\t\t\t\tresolve(1);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tif (this.timestamps) {\n\t\t\t\tlet date = new Date();\n\n\t\t\t\tif (!update.$set) {\n\t\t\t\t\tupdate.$set = <any>{updatedAt: date};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tupdate.$set.updatedAt = date;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\n\t\t\t\tconst isValid = validation.validate(update, {modifier: true});\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - updateMany', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on updateMany - ' + this.collectionName, [validation.validationErrors(), update]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ((this.useVersions && !bypassVersions) || (this.createLogs && !bypassLogs)) {\n\t\t\t\tlet docs = await this.find(filter);\n\t\n\t\t\t\tfor (let i = 0; i < docs.length; i++) {\n\t\t\t\t\tlet doc = docs[i];\n\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, options])) < 200000 ? JSON.stringify([doc, filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'updateMany',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.useVersions) {\n\t\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\t\t\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (doc.__v >= 4) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 4}}]});\n\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\tif (!objectContainsPropertyDeep(update, '__v')) {\n\t\t\t\t\t\t\tif (!update.$inc) {\n\t\t\t\t\t\t\t\tupdate.$inc = {__v: 1};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (!update.$inc.__v) {\n\t\t\t\t\t\t\t\tupdate.$inc.__v = 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet monitor = new MonitorMongo('updateMany', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).updateMany(<any>filter, update, options).then(res => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t}\n\t\t\t}, err => {\n\t\t\t\tmonitor.finish();\n\t\t\t\tconsole.log(new Date(), 'Error Update Many', this.collectionName, filter, update, options, err);\n\t\t\t\treject(err)\n\t\t\t});\n\t\t});\n\t}\n\n\tupdateOne(filter: MongoManagerFilter<T> & MongoManagerFilterOperators<T>, update: MongoManagerUpdateFilter<T>, options?: UpdateOptions, bypassLogs = false, bypassCheckSchema = false) : Promise<number> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (this.checkSchema && !bypassCheckSchema) {\n\t\t\t\tconst validation = this.simplschema.newContext();\t\t\t\n\t\t\t\tconst isValid = validation.validate(update, {modifier: true});\n\n\t\t\t\tif (!isValid) {\n\t\t\t\t\tconsole.log(new Date(), this.collectionName, 'Schema Errors - updateOne', validation.validationErrors());\n\t\t\t\t\tResolveIOServer.getMainServer().getMethodManager().callMethodInternal.call(ResolveIOServer.getMainServer().getMethodManager(), 'insertErrorLog', 'Schema Failed on updateOne - ' + this.collectionName, [validation.validationErrors(), update]);\n\t\t\t\t\treject(validation.validationErrors());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ((!update.$inc || JSON.stringify(update.$inc) === '{}') && (!update.$set || JSON.stringify(update.$set) === '{}') && (!update.$setOnInsert || JSON.stringify(update.$setOnInsert) === '{}') && (!update.$unset || JSON.stringify(update.$unset) === '{}')) {\n\t\t\t\tresolve(1);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet date = new Date();\n\n\t\t\tif (this.timestamps) {\n\t\t\t\tif (!update.$set) {\n\t\t\t\t\tupdate.$set = <any>{updatedAt: date};\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tupdate.$set.updatedAt = date;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif (this.useVersions) {\n\t\t\t\tlet doc = await this.findOne(filter, null, true);\n\n\t\t\t\tif (doc) {\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: doc._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, options])) < 200000 ? JSON.stringify([doc, filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tlet versionDoc = deepCopy(doc);\n\t\t\t\t\tversionDoc._id = {_id: doc._id, __v: doc.__v};\n\t\n\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).replaceOne(<any>{_id: { _id: doc._id, __v: doc.__v}}, versionDoc, {upsert: true});\n\t\t\t\t\t\n\t\t\t\t\tif (doc.__v >= 4) {\n\t\t\t\t\t\tResolveIOServer.getMongoManager().collection(this.versionCollection).deleteMany(<any>{$and: [{'_id._id': doc._id}, {'_id.__v': {$lt: doc.__v - 4}}]});\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (!objectContainsPropertyDeep(update, '__v')) {\n\t\t\t\t\t\tif (!update.$inc) {\n\t\t\t\t\t\t\tupdate.$inc = {__v: 1};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (!update.$inc.__v) {\n\t\t\t\t\t\t\tupdate.$inc.__v = 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tlet monitor = new MonitorMongo('updateOne', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).updateOne(<any>filter, update, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Update One', this.collectionName, filter, update, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse if (options && options.upsert) {\n\t\t\t\t\tif (!update.$setOnInsert) {\n\t\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t__v: 0,\n\t\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t__v: 0\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (!update.$setOnInsert._id) {\n\t\t\t\t\t\t\tupdate.$setOnInsert._id = objectIdHexString();\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif (this.timestamps && !update.$setOnInsert.createdAt) {\n\t\t\t\t\t\t\tupdate.$setOnInsert.createdAt = new Date();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\tid_document: update.$setOnInsert._id,\n\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, update, options])) < 200000 ? JSON.stringify(['upsert', filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tlet monitor = new MonitorMongo('updateOne', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).updateOne(<any>filter, update, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Update One', this.collectionName, filter, update, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treject('No Document');\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (options && options.upsert) {\n\t\t\t\t\tif (!update.$setOnInsert) {\n\t\t\t\t\t\tif (this.timestamps) {\n\t\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\tcreatedAt: new Date()\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tupdate.$setOnInsert = <any>{\n\t\t\t\t\t\t\t\t_id: objectIdHexString()\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (!update.$setOnInsert._id) {\n\t\t\t\t\t\t\tupdate.$setOnInsert._id = objectIdHexString();\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif (this.timestamps && !update.$setOnInsert.createdAt) {\n\t\t\t\t\t\t\tupdate.$setOnInsert.createdAt = new Date();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this.createLogs && !bypassLogs) {\n\t\t\t\t\tif (!options) {\n\t\t\t\t\t\toptions = <FindOneAndUpdateOptions>{returnDocument: 'before'};\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t(<FindOneAndUpdateOptions>options).returnDocument = 'before';\n\t\t\t\t\t}\n\n\t\t\t\t\tlet monitor = new MonitorMongo('findOneAndUpdate', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).findOneAndUpdate(<any>filter, update, <FindOneAndUpdateOptions>options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tlet doc = res.value;\n\n\t\t\t\t\t\tif (doc) {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: <any>doc._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify([doc, filter, update, options])) < 200000 ? JSON.stringify([doc, filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tresolve(res.ok);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (update.$setOnInsert) {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'document',\n\t\t\t\t\t\t\t\tcollection: this.collectionName,\n\t\t\t\t\t\t\t\tid_document: update.$setOnInsert._id,\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(['upsert', filter, update, options])) < 200000 ? JSON.stringify(['upsert', filter, update, options], null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: 'updateOne',\n\t\t\t\t\t\t\t\tid_user: '',\n\t\t\t\t\t\t\t\tuser: '',\n\t\t\t\t\t\t\t\tmessageId: 0,\n\t\t\t\t\t\t\t\troute: ''\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\n\t\t\t\t\t\t\tresolve(res.ok);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tresolve(0);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Find One And Update', this.collectionName, filter, update, options, err);\n\t\t\t\t\t\treject(err)\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlet monitor = new MonitorMongo('updateOne', this.collectionName, JSON.stringify([filter, update, options]));\n\t\t\t\t\tResolveIOServer.getMainDB().collection(this.collectionName, this.collectionOptions).updateOne(<any>filter, update, options).then(res => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tif (res.acknowledged) {\n\t\t\t\t\t\t\tResolveIOServer.getMongoManager().invalidateQueryCache(this.collectionName);\n\t\t\t\t\t\t\tresolve(res.modifiedCount);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\treject(res.acknowledged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, err => {\n\t\t\t\t\t\tmonitor.finish();\n\t\t\t\t\t\tconsole.log(new Date(), 'Error Update One', this.collectionName, filter, update, options, err);\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\t\n\twatchCollection(pipeline = [], options?: ChangeStreamOptions): ChangeStream<T> {\n\t\tlet stream = ResolveIOServer.getMainDB().collection<T>(this.collectionName, this.collectionOptions).watch(pipeline, options);\n\t\treturn <ChangeStream<T>>stream;\n\t}\n}\n\nexport class MongoManagerUserCollection<T extends CollectionDocument> extends MongoManagerCollection<T> {\n\tauthenticate(user: UserModel, password: string): Promise<{data: UserModel, error: string}> {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tconst attemptsInterval = Math.pow(100, Math.log(user.attempts + 1));\n\t\t\tconst calculatedInterval = attemptsInterval < 300000 ? attemptsInterval : 300000;\n\t\t\n\t\t\tif (user.last) {\n\t\t\t\tif (Date.now() - user.last.getTime() < calculatedInterval) {\n\t\t\t\t\tuser.last = new Date();\n\t\t\t\t\tawait Users.updateOne({_id: user._id}, {$set: {last: user.last}});\n\t\t\t\t\tresolve({\n\t\t\t\t\t\tdata: null,\n\t\t\t\t\t\terror: 'Attempt Too Soon'\n\t\t\t\t\t});\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tuser.last = new Date();\n\t\t\t}\n\t\t\n\t\t\tif (user.attempts >= 5) {\n\t\t\t\tresolve({\n\t\t\t\t\tdata: null,\n\t\t\t\t\terror: 'Too Many Attempts'\n\t\t\t\t});\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tif (!user.salt) {\n\t\t\t\tresolve({\n\t\t\t\t\tdata: null,\n\t\t\t\t\terror: 'No Salt Value Stored'\n\t\t\t\t});\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tpbkdf2(password, user.salt, {\n\t\t\t\titerations: 25000,\n\t\t\t\tkeylen: 512,\n\t\t\t\tdigestAlgorithm: 'sha256'\n\t\t\t}, async (err, hashBuffer) => {\n\t\t\t\tif (err) {\n\t\t\t\t\treturn reject(err);\n\t\t\t\t}\n\t\t\t\n\t\t\t\tif (scmp(hashBuffer, Buffer.from(user.hash, 'hex'))) {\n\t\t\t\t\tuser.last = new Date();\n\t\t\t\t\tuser.attempts = 0;\n\t\t\t\t\tawait Users.updateOne({_id: user._id}, {$set: {last: user.last, attempts: user.attempts}});\n\n\t\t\t\t\tresolve({\n\t\t\t\t\t\tdata: user,\n\t\t\t\t\t\terror: ''\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tuser.last = new Date();\n\t\t\t\t\tuser.attempts = user.attempts + 1;\n\t\t\t\t\tawait Users.updateOne({_id: user._id}, {$set: {last: user.last, attempts: user.attempts}});\n\n\t\t\t\t\tif (user.attempts >= 5) {\n\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\tdata: null,\n\t\t\t\t\t\t\terror: 'Too Many Attempts'\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\tdata: null,\n\t\t\t\t\t\t\terror: 'Invalid Username And Password'\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t});\n\t\t});\n\t}\n\n\tserializeUser() {\n\t\treturn (user, cb) => {\n\t\t\tcb(null, user.username);\n\t\t};\n\t}\n\n\tdeserializeUser() {\n\t\treturn (username, cb) => {\n\t\t\tUsers.findOne({username: username}).then(res => {\n\t\t\t\tcb(null, res);\n\t\t\t}, err => {\n\t\t\t\tcb(err, null);\n\t\t\t});\n\t\t};\n\t}\n\n\tsetPassword(user: UserModel, password: string) {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!user) {\n\t\t\t\treject('No User');\n\t\t\t}\n\t\t\telse if (!password) {\n\t\t\t\treject('No Password');\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet saltBuffer = await randomBytes(32);\n\t\t\t\tlet salt = saltBuffer.toString('hex');\n\t\t\t\tlet hashRaw = await pbkdf2Promisified(password, salt, {\n\t\t\t\t\titerations: 25000,\n\t\t\t\t\tkeylen: 512,\n\t\t\t\t\tdigestAlgorithm: 'sha256'\n\t\t\t\t});\n\t\t\t\tlet hash = Buffer.from(hashRaw, 'binary').toString('hex');\n\t\t\t\tUsers.updateOne({_id: user._id}, {$set: {hash: hash, salt: salt, services: {}, attempts: 0}}).then(res => resolve(res), rej => reject(rej));\n\t\t\t}\n\t\t});\n\t};\n\n\tchangePassword(user, oldPassword, newPassword) {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!user) {\n\t\t\t\treject('Missing User');\n\t\t\t}\n\t\t\telse if (!oldPassword || !newPassword) {\n\t\t\t\treject('Missing Password');\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet authUser = await this.authenticate(user, oldPassword);\n\n\t\t\t\tif (!authUser['data']) {\n\t\t\t\t\treject(authUser['error']);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.setPassword(user, newPassword).then(res => resolve(res), rej => reject(rej));\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\t\n\tregister(user, password) {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\tif (!user.username) {\n\t\t\t\treject('Missing Username');\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet dbUser = await Users.findOne({username: user.username});\n\t\t\t\t\n\t\t\t\tif (dbUser) {\n\t\t\t\t\treject('Username Exists');\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tdbUser = await Users.findOne({email: user.email});\n\n\t\t\t\t\tif (dbUser) {\n\t\t\t\t\t\treject('Email Exists');\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tuser.setPassword(password);\n\t\t\t\t\t\tresolve(user);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tresetAttempts(user: UserModel) {\n\t\treturn Users.updateOne({_id: user._id}, {$set: {attempts: 0}});\n\t}\n}\n\nexport function objectIdHexString() {\n\tlet objectId = new ObjectId();\n\treturn objectId.toHexString();\n}\n\nfunction pbkdf2(password, salt, options, callback) {\n\tcrypto.pbkdf2(password, salt, options.iterations, options.keylen, options.digestAlgorithm, callback);\n};\n\nfunction pbkdf2Promisified(password, salt, options): Promise<any> {\n\treturn new Promise((resolve, reject) => pbkdf2(password, salt, options, (err, hashRaw) => (err ? reject(err) : resolve(hashRaw))));\n}\n\nfunction randomBytes(saltlen): Promise<Buffer> {\n\treturn new Promise((resolve, reject) => crypto.randomBytes(saltlen, (err, saltBuffer) => (err ? reject(err) : resolve(saltBuffer))));\n}\n\nfunction objectContainsPropertyDeep(obj: Object, prop: string) {\n\tlet keys = Object.keys(obj);\n\n\tif (keys.some(a => a === prop)) {\n\t\treturn true;\n\t}\n\t\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tlet key = keys[i];\n\t\tif (obj[key] && typeof obj[key] === 'object' && objectContainsPropertyDeep(obj[key], prop)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}"]}