diff --git a/agents/drivers/mongodb/src/main/java/com/dbx/agent/mongodb/MongoAgent.java b/agents/drivers/mongodb/src/main/java/com/dbx/agent/mongodb/MongoAgent.java index a3d004f7f..cf2453e49 100644 --- a/agents/drivers/mongodb/src/main/java/com/dbx/agent/mongodb/MongoAgent.java +++ b/agents/drivers/mongodb/src/main/java/com/dbx/agent/mongodb/MongoAgent.java @@ -906,10 +906,9 @@ public final class MongoAgent { return converted; } if (value instanceof String text) { + // Plain JSON strings must retain their BSON type; only explicit shell date syntax + // is converted here. Extended JSON $date values are decoded by Document.parse. Date date = parseMongoShellDate(text); - if (date == null) { - date = parseLegacyDateDisplay(text); - } return date == null ? value : date; } return value; @@ -938,28 +937,6 @@ public final class MongoAgent { } } - static Date parseLegacyDateDisplay(String value) { - String trimmed = value.trim(); - if (!trimmed.matches("\\d{4}-\\d{2}-\\d{2}[ T]\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,3})?")) { - return null; - } - String normalized = trimmed.replace(' ', 'T'); - int dot = normalized.indexOf('.'); - if (dot < 0) { - normalized = normalized + ".000"; - } else { - int millisStart = dot + 1; - int millisEnd = normalized.length(); - normalized = normalized.substring(0, millisStart) - + String.format("%-3s", normalized.substring(millisStart, millisEnd)).replace(' ', '0'); - } - try { - return Date.from(Instant.parse(normalized + "Z")); - } catch (Exception e) { - return null; - } - } - private static Object dispatch(String method, JsonObject params) { return switch (method) { case AgentProtocol.METHOD_HANDSHAKE -> AgentProtocol.handshakeResult(); diff --git a/agents/drivers/mongodb/src/test/java/com/dbx/agent/mongodb/MongoAgentTest.java b/agents/drivers/mongodb/src/test/java/com/dbx/agent/mongodb/MongoAgentTest.java index 65428267c..d09faa119 100644 --- a/agents/drivers/mongodb/src/test/java/com/dbx/agent/mongodb/MongoAgentTest.java +++ b/agents/drivers/mongodb/src/test/java/com/dbx/agent/mongodb/MongoAgentTest.java @@ -569,12 +569,52 @@ class MongoAgentTest { } @Test - void documentForWriteParsesLegacyDateDisplayStrings() { - Document doc = MongoAgent.documentForWrite("{\"$set\":{\"CreateDate\":\"2025-08-14 02:25:43.718\"}}"); + void documentForWritePreservesDateShapedStrings() { + Document doc = MongoAgent.documentForWrite( + "{\"$set\":{\"CreateDate\":\"2025-08-14 02:25:43.718\"," + + "\"nested\":{\"updated\":\"2025-08-14T02:25:43\"}," + + "\"items\":[\"2025-08-14 02:25:43\"]}}" + ); Document set = (Document) doc.get("$set"); - assertTrue(set.get("CreateDate") instanceof Date); - assertEquals(1_755_138_343_718L, ((Date) set.get("CreateDate")).getTime()); + assertEquals("2025-08-14 02:25:43.718", set.getString("CreateDate")); + assertEquals("2025-08-14T02:25:43", ((Document) set.get("nested")).getString("updated")); + assertEquals("2025-08-14 02:25:43", ((List) set.get("items")).get(0)); + } + + @Test + void documentForWriteParsesExtendedJsonDates() { + Document doc = MongoAgent.documentForWrite( + "{\"created\":{\"$date\":\"2026-06-10T13:59:31.287Z\"}," + + "\"items\":[{\"updated\":{\"$date\":{\"$numberLong\":\"1781100000000\"}}}]}" + ); + + assertTrue(doc.get("created") instanceof Date); + Document item = (Document) ((List) doc.get("items")).get(0); + assertTrue(item.get("updated") instanceof Date); + } + + @Test + void updatePipelinePreservesStringsAndParsesExplicitDates() { + List pipeline = MongoAgent.updatePipelineForWrite( + "[{\"$set\":{\"label\":\"2025-08-14 02:25:43.718\"," + + "\"created\":\"ISODate(\\\"2026-06-10T13:59:31.287Z\\\")\"}}]" + ); + + Document set = (Document) pipeline.get(0).get("$set"); + assertEquals("2025-08-14 02:25:43.718", set.getString("label")); + assertTrue(set.get("created") instanceof Date); + } + + @Test + void filterDocumentsPreserveDateShapedStrings() { + Document filter = MongoAgent.documentForWrite( + "{\"created\":\"2025-08-14 02:25:43.718\"," + + "\"updated\":{\"$date\":\"2026-06-10T13:59:31.287Z\"}}" + ); + + assertEquals("2025-08-14 02:25:43.718", filter.getString("created")); + assertTrue(filter.get("updated") instanceof Date); } @Test