diff --git a/driver-core/src/main/com/mongodb/client/model/mql/MqlValues.java b/driver-core/src/main/com/mongodb/client/model/mql/MqlValues.java index c91994872b3..8d791dc6b3b 100644 --- a/driver-core/src/main/com/mongodb/client/model/mql/MqlValues.java +++ b/driver-core/src/main/com/mongodb/client/model/mql/MqlValues.java @@ -233,7 +233,7 @@ public static MqlArray ofDateArray(final Instant... array) { */ public static MqlString of(final String of) { Assertions.notNull("String", of); - return new MqlExpression<>((codecRegistry) -> new AstPlaceholder(new BsonString(of))); + return new MqlExpression<>((codecRegistry) -> new AstPlaceholder(wrapString(of))); } /** @@ -249,11 +249,20 @@ public static MqlArray ofStringArray(final String... array) { List result = new ArrayList<>(); for (String e : array) { Assertions.notNull("elements of array", e); - result.add(new BsonString(e)); + result.add(wrapString(e)); } return new MqlExpression<>((cr) -> new AstPlaceholder(new BsonArray(result))); } + private static BsonValue wrapString(final String s) { + BsonString bson = new BsonString(s); + if (s.contains("$")) { + return new BsonDocument("$literal", bson); + } else { + return bson; + } + } + /** * Returns a reference to the "current" * {@linkplain MqlDocument document} value. diff --git a/driver-core/src/test/functional/com/mongodb/client/model/mql/ArrayMqlValuesFunctionalTest.java b/driver-core/src/test/functional/com/mongodb/client/model/mql/ArrayMqlValuesFunctionalTest.java index 59ca6027742..c183558d59f 100644 --- a/driver-core/src/test/functional/com/mongodb/client/model/mql/ArrayMqlValuesFunctionalTest.java +++ b/driver-core/src/test/functional/com/mongodb/client/model/mql/ArrayMqlValuesFunctionalTest.java @@ -77,6 +77,12 @@ public void literalsTest() { Arrays.asList("a", "b", "c"), ofStringArray("a", "b", "c"), "['a', 'b', 'c']"); + // must escape: + assertExpression( + Arrays.asList("$a", "b", "$c.d"), + ofStringArray("$a", "b", "$c.d"), + "[{'$literal': '$a'}, 'b', {'$literal': '$c.d'}]"); + // Date assertExpression( Arrays.asList(Instant.parse("2007-12-03T10:15:30.00Z")), diff --git a/driver-core/src/test/functional/com/mongodb/client/model/mql/StringMqlValuesFunctionalTest.java b/driver-core/src/test/functional/com/mongodb/client/model/mql/StringMqlValuesFunctionalTest.java index 34e39b9d483..de29a2400f2 100644 --- a/driver-core/src/test/functional/com/mongodb/client/model/mql/StringMqlValuesFunctionalTest.java +++ b/driver-core/src/test/functional/com/mongodb/client/model/mql/StringMqlValuesFunctionalTest.java @@ -38,6 +38,12 @@ public void literalsTest() { assertExpression("abc", of("abc"), "'abc'"); assertThrows(IllegalArgumentException.class, () -> of((String) null)); assertExpression(fish, of(fish), "'" + fish + "'"); + + // must escape: + assertExpression( + "$abc", + of("$abc"), + "{'$literal': '$abc'}"); } @Test