@entria/graphql-mongoose-loader
Version:
GraphQL Mongoose Loader helpers
27 lines (26 loc) • 1.08 kB
JavaScript
;
/**
* Helper to batch queries on mongoose
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.cacheKeyFn = void 0;
function indexResults(results, indexField, cacheKey = exports.cacheKeyFn) {
const indexedResults = new Map();
results.forEach(res => {
indexedResults.set(cacheKey(res[indexField]), res);
});
return indexedResults;
}
function normalizeResults(keys, indexField, cacheKey = exports.cacheKeyFn) {
return (results) => {
const indexedResults = indexResults(results, indexField, cacheKey);
return keys.map(val => indexedResults.get(cacheKey(val)) || new Error(`Key not found : ${val}`));
};
}
const cacheKeyFn = (key) => key.toString();
exports.cacheKeyFn = cacheKeyFn;
async function mongooseLoader(model, keys, lean = true, keyField = '_id') {
const results = lean ? await model.find({ [keyField]: { $in: keys } }).lean() : await model.find({ [keyField]: { $in: keys } });
return normalizeResults(keys, keyField, exports.cacheKeyFn)(results);
}
exports.default = mongooseLoader;