Получение нежелательного вывода из сортировки MongoDB - PullRequest
4 голосов
/ 04 мая 2020

Я пытаюсь отсортировать версии выпуска в виде "ab c"

Я использую mon go - java -driver

<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongo-java-driver</artifactId>
    <version>3.8.0</version>
</dependency>

Я создал индекс с сопоставлением:

{
    "v" : 2,
    "key" : {
            "version" : 1
    },
    "name" : "version_1",
    "ns" : "db.sysversion",
    "collation" : {
            "locale" : "en",
            "caseLevel" : false,
            "caseFirst" : "off",
            "strength" : 3,
            "numericOrdering" : true,
            "alternate" : "non-ignorable",
            "maxVariable" : "punct",
            "normalization" : false,
            "backwards" : false,
            "version" : "57.1"
    }
}

Я реализовал запрос агрегации с драйвером java:

Collation collation = Collation.builder().locale("en").numericOrdering(true).build();

ArrayList<Document> response = new ArrayList<>();

ArrayList<Bson> aggregate = new ArrayList<Bson>(Arrays.asList(
  match(gt("version", "1.9.4")), sort(descending("version")),
  project(fields(include("version"), exclude("_id")))
));

this.database.getCollection(sysversion).aggregate(aggregate).collation(collation).into(response);

И я возвращаю список в документе как API ответ.

return new Document("version", response);

Но вывод, который я получаю:

{ "version" : [{ "version" : "\u000f\u0003\b\u000f\f\b\u000f\u0003\u0001\t\u0001\t" }, { "version" : "\u000f\u0003\b\u000f\f\b\u000f\u0002\u0001\t\u0001\t" }] }

И когда я попробовал то же самое с оболочкой Mon go, я получаю следующий вывод ( что правильно)

{
  version:[
    {
    "version" : "1.10.1"
    },
    {
    "version" : "1.10.0"
    }
  ]
}

Что не так с моим Java кодом? Это версия или ошибка в коде?

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 12 мая 2020

Обнаружена проблема

Я отладил проблему, обнаружив, что для сопоставления используется normalization для кодирования ответа на запрос. И по умолчанию это значение равно false. Таким образом, запрос оболочки возвращал правильный вывод.

Но в понедельник go - java -Драйвер устанавливал normalization как true (по умолчанию).

Обновлен строитель с нормализацией как false для того же:

Collation collation = Collation.builder().locale("en").numericOrdering(true).normalization(false).build();
ArrayList<Document> response = new ArrayList<>();

ArrayList<Bson> aggregate = new ArrayList<Bson>(Arrays.asList(
  match(gt("version", "1.9.4")), sort(descending("version")),
  project(fields(include("version"), exclude("_id")))
));

this.database.getCollection(sysversion).aggregate(aggregate).collation(collation).into(response);

Это исправило мою проблему.

...