diff --git a/packages/web/src/appobj/DatabaseAppObject.svelte b/packages/web/src/appobj/DatabaseAppObject.svelte index b5ee5def8..67cc437f3 100644 --- a/packages/web/src/appobj/DatabaseAppObject.svelte +++ b/packages/web/src/appobj/DatabaseAppObject.svelte @@ -38,6 +38,24 @@ ); }; + const handleNewCollection = () => { + showModal(InputTextModal, { + value: '', + label: 'New collection name', + header: 'Create collection', + onConfirm: async newCollection => { + const dbid = { conid: connection._id, database: name }; + await axiosInstance.request({ + url: 'database-connections/run-script', + method: 'post', + params: dbid, + data: { sql: `db.createCollection('${newCollection}')` }, + }); + axiosInstance.post('database-connections/sync-model', dbid); + }, + }); + }; + const handleImport = () => { showModal(ImportExportModal, { initialValues: { @@ -102,9 +120,12 @@ ); }; + const driver = findEngineDriver(connection, getExtensions()); + return [ { onClick: handleNewQuery, text: 'New query', isNewQuery: true }, - { onClick: handleNewTable, text: 'New table' }, + !driver?.dialect?.nosql && { onClick: handleNewTable, text: 'New table' }, + driver?.dialect?.nosql && { onClick: handleNewCollection, text: 'New collection' }, { divider: true }, { onClick: handleImport, text: 'Import' }, { onClick: handleExport, text: 'Export' }, @@ -132,12 +153,14 @@ import { showModal } from '../modals/modalTools'; import SqlGeneratorModal from '../modals/SqlGeneratorModal.svelte'; import { getDefaultFileFormat } from '../plugins/fileformats'; - import { currentArchive, currentDatabase, extensions, selectedWidget } from '../stores'; + import { currentArchive, currentDatabase, extensions, getExtensions, selectedWidget } from '../stores'; import axiosInstance from '../utility/axiosInstance'; import getElectron from '../utility/getElectron'; import openNewTab from '../utility/openNewTab'; import AppObjectCore from './AppObjectCore.svelte'; import { showSnackbarSuccess } from '../utility/snackbar'; + import { findEngineDriver } from 'dbgate-tools'; + import InputTextModal from '../modals/InputTextModal.svelte'; export let data; function createMenu() { diff --git a/packages/web/src/appobj/DatabaseObjectAppObject.svelte b/packages/web/src/appobj/DatabaseObjectAppObject.svelte index 51dfb9c18..67fff6cdc 100644 --- a/packages/web/src/appobj/DatabaseObjectAppObject.svelte +++ b/packages/web/src/appobj/DatabaseObjectAppObject.svelte @@ -308,6 +308,10 @@ label: 'Export', isExport: true, }, + { + label: 'Drop collection', + isDropCollection: true, + }, { divider: true, }, @@ -396,6 +400,7 @@ import ConfirmSqlModal from '../modals/ConfirmSqlModal.svelte'; import axiosInstance from '../utility/axiosInstance'; import { alterDatabaseDialog, renameDatabaseObjectDialog } from '../utility/alterDatabaseTools'; + import ConfirmModal from '../modals/ConfirmModal.svelte'; export let data; @@ -538,6 +543,20 @@ ); obj.pureName = newName; }); + } else if (menu.isDropCollection) { + showModal(ConfirmModal, { + message: `Really drop collection ${data.pureName}?`, + onConfirm: async () => { + const dbid = _.pick(data, ['conid', 'database']); + await axiosInstance.request({ + url: 'database-connections/run-script', + method: 'post', + params: dbid, + data: { sql: `db.dropCollection('${data.pureName}')` }, + }); + axiosInstance.post('database-connections/sync-model', dbid); + }, + }); } else { openDatabaseObjectDetail( menu.tab, diff --git a/plugins/dbgate-plugin-mongo/src/backend/driver.js b/plugins/dbgate-plugin-mongo/src/backend/driver.js index 791c05e39..dcb90225a 100644 --- a/plugins/dbgate-plugin-mongo/src/backend/driver.js +++ b/plugins/dbgate-plugin-mongo/src/backend/driver.js @@ -88,6 +88,12 @@ const driver = { columns: [], }; }, + async script(pool, sql) { + let func; + func = eval(`(db,ObjectId) => { ${sql} }`); + const db = await getScriptableDb(pool); + func(db, ObjectId); + }, async stream(pool, sql, options) { let func; try {