fix: support mongodb copy insert statements

This commit is contained in:
zipg authored and GitHub committed 2026-06-28 22:09:16 +08:00
1 parent 7b32c71b1b
commit e2f6edba9c
5 files changed
+169 -9

No files matched your search

@@ -12,6 +12,7 @@ import { formatSqlInsert } from "@/lib/exportFormats";
import { uuid } from "@/lib/utils";
import { useSettingsStore } from "@/stores/settingsStore";
import { expandNestedJsonStringsForCopy } from "@/lib/jsonCopyValue";
import { buildMongoCopyInsertDocument, formatMongoShellLiteral, type MongoInputValue } from "@/lib/mongoDocumentValues";
import type { DatabaseType, QueryResult } from "@/types/database";
import type { QueryResultExportRequest } from "@/lib/api";
@@ -31,6 +32,7 @@ export interface UseDataGridExportOptions {
displayItems: ComputedRef<RowItem[]>;
sql: ComputedRef<string | undefined>;
tableMeta: ComputedRef<DataGridTableMeta | undefined>;
copyInsertTargetLabel?: ComputedRef<string | undefined>;
databaseType: ComputedRef<DatabaseType | undefined>;
connectionId: ComputedRef<string | undefined>;
database: ComputedRef<string | undefined>;
@@ -100,6 +102,7 @@ export function useDataGridExport(options: UseDataGridExportOptions) {
displayItems,
sql,
tableMeta,
copyInsertTargetLabel,
sourceColumns,
databaseType,
connectionId,
@@ -192,6 +195,7 @@ export function useDataGridExport(options: UseDataGridExportOptions) {
databaseType: databaseType.value ?? null,
schema: tableMeta.value?.schema ?? null,
tableName: tableMeta.value?.tableName ?? null,
copyInsertTargetLabel: copyInsertTargetLabel?.value ?? null,
columns: columns.value,
sourceColumns: sourceColumns.value ?? null,
excludePrimaryKeys,
@@ -238,14 +242,23 @@ export function useDataGridExport(options: UseDataGridExportOptions) {
});
try {
const statement = await buildDataGridCopyInsertStatement({
databaseType: databaseType.value,
tableMeta: tableMeta.value,
columns: columns.value,
sourceColumns: sourceColumns.value,
rows: rows.map((item) => item.data),
excludePrimaryKeys,
});
const statement =
databaseType.value === "mongodb"
? buildMongoCopyInsertStatement({
collection: copyInsertTargetLabel?.value || tableMeta.value?.tableName || "collection",
columns: columns.value,
sourceColumns: sourceColumns.value,
rows: rows.map((item) => item.data),
excludePrimaryKeys,
})
: await buildDataGridCopyInsertStatement({
databaseType: databaseType.value,
tableMeta: tableMeta.value,
columns: columns.value,
sourceColumns: sourceColumns.value,
rows: rows.map((item) => item.data),
excludePrimaryKeys,
});
const latest = insertCopyCache(excludePrimaryKeys);
if (latest.key !== key) return;
setInsertCopyCache(excludePrimaryKeys, {
@@ -1093,6 +1106,17 @@ function replaceControlCharacters(value: string, replacement: string): string {
.join("");
}
function buildMongoCopyInsertStatement(options: { collection: string; columns: string[]; sourceColumns?: Array<string | undefined>; rows: CellValue[][]; excludePrimaryKeys?: boolean }): string | undefined {
const saveColumns = effectiveColumns(options.sourceColumns, options.columns);
const columnIndexes = saveColumns.map((column, index) => ({ column, index })).filter((item): item is { column: string; index: number } => !!item.column);
if (columnIndexes.length === 0 || options.rows.length === 0) return undefined;
const documentColumns = columnIndexes.map((item) => item.column);
const documents = options.rows.map((row) => buildMongoCopyInsertDocument(columnIndexes.map((item) => row[item.index]) as MongoInputValue[], documentColumns, { excludePrimaryKeys: options.excludePrimaryKeys }));
const collection = `db.getCollection(${JSON.stringify(options.collection)})`;
if (documents.length === 1) return `${collection}.insert(${formatMongoShellLiteral(documents[0])});`;
return `${collection}.insertMany(${formatMongoShellLiteral(documents)});`;
}
function compactLocalTimestamp(date = new Date()): string {
const yy = String(date.getFullYear() % 100).padStart(2, "0");
const month = String(date.getMonth() + 1).padStart(2, "0");