diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ArrayOperators.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ArrayOperators.java index 41688bfc62..8e746833a3 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ArrayOperators.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ArrayOperators.java @@ -2067,5 +2067,27 @@ public SortArray by(Sort sort) { protected String getMongoMethod() { return "$sortArray"; } + + /** + * Sort the array elements by their values in ascending order. + * Suitable for arrays of simple types (e.g., integers, strings). + * + * @return new instance of {@link SortArray}. + * @since 4.x (TBD) + */ + public SortArray byValueAscending() { + return new SortArray(append("sortBy", 1)); + } + + /** + * Sort the array elements by their values in descending order. + * Suitable for arrays of simple types (e.g., integers, strings). + * + * @return new instance of {@link SortArray}. + * @since 4.x (TBD) + */ + public SortArray byValueDescending() { + return new SortArray(append("sortBy", -1)); + } } } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/ArrayOperatorsUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/ArrayOperatorsUnitTests.java index 007fdbb28c..7b3f7c866c 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/ArrayOperatorsUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/ArrayOperatorsUnitTests.java @@ -179,4 +179,26 @@ void sortByWithFieldRef() { assertThat(ArrayOperators.arrayOf("team").sort(Sort.by("name")).toDocument(Aggregation.DEFAULT_CONTEXT)) .isEqualTo("{ $sortArray: { input: \"$team\", sortBy: { name: 1 } } }"); } + + @Test // GH-4929 + public void sortArrayByValueAscending() { + Document result = ArrayOperators.SortArray.sortArrayOf("numbers").byValueAscending().toDocument(Aggregation.DEFAULT_CONTEXT); + Document expected = new Document("$sortArray", new Document("input", "$numbers").append("sortBy", 1)); + assertThat(result).isEqualTo(expected); + } + + @Test // GH-4929 + public void sortArrayByValueDescending() { + Document result = ArrayOperators.SortArray.sortArrayOf("numbers").byValueDescending().toDocument(Aggregation.DEFAULT_CONTEXT); + Document expected = new Document("$sortArray", new Document("input", "$numbers").append("sortBy", -1)); + assertThat(result).isEqualTo(expected); + } + + @Test // GH-4929 + public void sortArrayByPropertyUnchanged() { + Document result = ArrayOperators.SortArray.sortArrayOf("items") + .by(Sort.by(Sort.Direction.ASC, "price")).toDocument(Aggregation.DEFAULT_CONTEXT); + Document expected = new Document("$sortArray", new Document("input", "$items").append("sortBy", new Document("price", 1))); + assertThat(result).isEqualTo(expected); + } }