diff --git a/backend/actions/Model/getDocuments.js b/backend/actions/Model/getDocuments.js index 53873b60..886e5c27 100644 --- a/backend/actions/Model/getDocuments.js +++ b/backend/actions/Model/getDocuments.js @@ -35,6 +35,9 @@ const GetDocumentsParams = new Archetype({ fields: { $type: 'string' }, + maxTimeMS: { + $type: 'number' + }, roles: { $type: ['string'] } @@ -45,7 +48,7 @@ module.exports = ({ db }) => async function getDocuments(params) { const { roles } = params; await authorize('Model.getDocuments', roles); - const { model, limit, skip, sortKey, sortDirection, searchText, fields } = params; + const { model, limit, skip, sortKey, sortDirection, searchText, fields, maxTimeMS } = params; const Model = db.models[model]; if (Model == null) { @@ -72,6 +75,9 @@ module.exports = ({ db }) => async function getDocuments(params) { if (projection != null) { query = query.select(projection); } + if (typeof maxTimeMS === 'number' && maxTimeMS > 0) { + query = query.maxTimeMS(maxTimeMS); + } const cursor = await query.cursor(); const docs = []; for (let doc = await cursor.next(); doc != null; doc = await cursor.next()) { diff --git a/backend/actions/Model/getDocumentsStream.js b/backend/actions/Model/getDocumentsStream.js index 6cc4d2fd..3fe228bb 100644 --- a/backend/actions/Model/getDocumentsStream.js +++ b/backend/actions/Model/getDocumentsStream.js @@ -35,6 +35,9 @@ const GetDocumentsParams = new Archetype({ fields: { $type: 'string' }, + maxTimeMS: { + $type: 'number' + }, roles: { $type: ['string'] } @@ -45,7 +48,7 @@ module.exports = ({ db }) => async function* getDocumentsStream(params) { const { roles } = params; await authorize('Model.getDocumentsStream', roles); - const { model, limit, skip, sortKey, sortDirection, searchText, fields } = params; + const { model, limit, skip, sortKey, sortDirection, searchText, fields, maxTimeMS } = params; const Model = db.models[model]; if (Model == null) { @@ -72,6 +75,9 @@ module.exports = ({ db }) => async function* getDocumentsStream(params) { if (projection != null) { query = query.select(projection); } + if (typeof maxTimeMS === 'number' && maxTimeMS > 0) { + query = query.maxTimeMS(maxTimeMS); + } const schemaPaths = {}; for (const path of Object.keys(Model.schema.paths)) { diff --git a/frontend/src/models/models.html b/frontend/src/models/models.html index 866b808a..f27d0168 100644 --- a/frontend/src/models/models.html +++ b/frontend/src/models/models.html @@ -197,6 +197,13 @@ > {{ showRowNumbers ? 'Hide row numbers' : 'Show row numbers' }} +