From 6efdd335edbf8c2bd34f6cda76130a1252c69c80 Mon Sep 17 00:00:00 2001 From: t8y2 <1156263951@qq.com> Date: Tue, 16 Jun 2026 22:38:37 +0800 Subject: [PATCH] fix(mongo): preserve int64 precision in document filter parsing --- apps/desktop/src/lib/documentStoreProvider.ts | 23 +++++++++++++++++-- apps/desktop/src/lib/mongoShellCommand.ts | 2 +- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/apps/desktop/src/lib/documentStoreProvider.ts b/apps/desktop/src/lib/documentStoreProvider.ts index 777072b96f..68c773290a 100644 --- a/apps/desktop/src/lib/documentStoreProvider.ts +++ b/apps/desktop/src/lib/documentStoreProvider.ts @@ -1,5 +1,6 @@ import type { ComposerTranslation } from "vue-i18n"; import type { DatabaseType } from "@/types/database"; +import { quoteUnquotedObjectKeys } from "@/lib/mongoShellCommand"; export type DocumentStoreKind = "mongodb" | "elasticsearch"; export type DocumentFilterMode = "equals" | "not-equals" | "like" | "not-like" | "greater-than" | "less-than" | "is-null" | "is-not-null"; @@ -118,10 +119,28 @@ export function combineDocumentFilterConditions(conditions: Record { + try { + const n = BigInt(num); + if (n > MAX_SAFE_BIGINT || n < -MAX_SAFE_BIGINT) { + return `${before}"${num}"${after}`; + } + } catch { + /* not a valid integer */ + } + return _match; + }); + return JSON.parse(safe); +} + export function parseDocumentFilterInput(input: string): Record { const trimmed = input.trim(); if (!trimmed) return {}; - const parsed = JSON.parse(trimmed); + const safe = quoteUnquotedObjectKeys(trimmed); + const parsed = parseJsonPreservingLargeIntegers(safe); return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? (parsed as Record) : {}; } @@ -135,7 +154,7 @@ function parseDocumentFilterValue(raw: string): unknown { const trimmed = raw.trim(); if (!trimmed) return ""; try { - return JSON.parse(trimmed); + return parseJsonPreservingLargeIntegers(trimmed); } catch { return trimmed; } diff --git a/apps/desktop/src/lib/mongoShellCommand.ts b/apps/desktop/src/lib/mongoShellCommand.ts index 43fe015bde..6b491e98b8 100644 --- a/apps/desktop/src/lib/mongoShellCommand.ts +++ b/apps/desktop/src/lib/mongoShellCommand.ts @@ -367,7 +367,7 @@ function convertSingleQuotedStrings(source: string): string { return quote === "'" ? source : result + source.slice(copiedUntil); } -function quoteUnquotedObjectKeys(source: string): string { +export function quoteUnquotedObjectKeys(source: string): string { let result = ""; let quote: string | null = null; let escaped = false;