使用 Morphia 进行不区分大小写的排序 (Java)

Case insensitive ordering with Morphia (Java)

我有一个 Java 项目和一个 MongoDB 数据库。我使用 Morphia 来查询数据。 我需要根据一个字段对这些数据进行排序,该字段可能以小写或大写字母开头(甚至是数字或符号,但与此无关)。 我的问题是 Morphia 似乎根据它们的 ASCII/Unicode 值对它们进行排序,所以我首先得到所有小写行,然后是所有大写行。 有没有办法告诉 Morphia 在排序过程中忽略大小写?

到目前为止我的(简化的)代码:

Query<MyObject> query = store.query(MyObject.class);
query = query.field("myfield").equal("some value");
query.order("myfield");
query.asList();

参考Case insensitive sorting in MongoDB,我们可以用{locale: "en"}设置排序规则。乍一看,这有点违反直觉。为什么设置语言环境可以使查询忽略大小写?

所以让我们检查一下the documentation of collation,区分大小写实际上是由caseLevel决定的。

Optional. Flag that determines whether to include case comparison at strength level 1 or 2.
...
If false, do not include case comparison at level 1 or 2. The default is false.

默认值为 false,因此只需设置语言环境,排序就会忽略大小写。


在Morphia中,我们可以设置Collation through FindOptions,如下所示。

Query<MyObject> query = store.query(MyObject.class);
query = query.field("myfield").equal("some value");
query.order("myfield");
FindOptions options = new FindOptions();
options.collation(Collation.builder().locale("en").build());
query.asList(options);