UNPKG

@joktec/mongo

Version:
71 lines 2.84 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.buildIndex = buildIndex; const utils_1 = require("@joktec/utils"); const typegoose_1 = require("@typegoose/typegoose"); const lodash_1 = require("lodash"); function injectParanoid(indexOption, paranoidKey = 'deletedAt') { if (!indexOption.options.partialFilterExpression) { indexOption.options.partialFilterExpression = {}; } if (indexOption.options.sparse) delete indexOption.options.sparse; Object.assign(indexOption.options.partialFilterExpression, { [paranoidKey]: { $type: 'null' } }); } function buildIndex(options) { const deletedAt = (0, lodash_1.get)(options, 'paranoid.deletedAt.name', 'deletedAt'); const paranoid = options?.paranoid ? deletedAt : null; const indexes = []; if (options?.index) { (0, utils_1.toArray)(options.index).map(key => { const fields = key.split(',').reduce((obj, curr) => { obj[curr] = 1; return obj; }, {}); const idx = { fields, options: { background: true } }; if (options.paranoid) injectParanoid(idx, paranoid); indexes.push(idx); }); } if (options?.unique) { (0, utils_1.toArray)(options.unique).map(key => { const partialFilterExpression = {}; const opts = { unique: true, background: true, sparse: true }; const fields = {}; key.split(',').map(field => { fields[field] = 1; partialFilterExpression[field] = { $exists: true, $type: ['string', 'number', 'date', 'objectId'] }; }); const idx = { fields, options: opts }; if (options.paranoid) { idx.options.partialFilterExpression = partialFilterExpression; injectParanoid(idx, paranoid); } indexes.push(idx); }); } if (options?.textSearch) { const fields = options.textSearch.split(',').reduce((obj, path) => { obj[path] = 'text'; return obj; }, {}); const idx = { fields, options: { background: true } }; indexes.push(idx); } if (options?.geoSearch) { const fields = { [options.geoSearch]: '2dsphere' }; const idx = { fields, options: { background: true } }; if (options.paranoid) injectParanoid(idx, paranoid); indexes.push(idx); } (0, utils_1.toArray)(options?.customIndexes).map(idx => { idx.options = { background: true, ...idx.options }; if (paranoid) injectParanoid(idx, paranoid); indexes.push(idx); }); return indexes.map(idx => (0, typegoose_1.index)(idx.fields, idx.options)); } //# sourceMappingURL=mongo.index.js.map