【问题标题】:Morphia ignores collationMorphia 忽略排序规则
【发布时间】:2017-02-22 11:31:03
【问题描述】:

我有一个 mongo 3.4 服务器,我需要运行不区分大小写的查询。 我已经创建了正确的索引,并且可以通过 mongo 控制台进行不区分大小写的查询。

    db.users.find(  {"name": "alex" }, { "name" : 1 } ).collation( { locale: 'en', strength: 2 } )

返回名称为 Alex、alex、ALEX 等的任何用户

我需要在使用 morphia 1.3.1 的 java 程序中执行相同的操作。

    Collation col = Collation.builder().locale("en").collationStrength(CollationStrength.SECONDARY).build();
    FindOptions fo = new FindOptions().collation(col);
    q.disableValidation().asList(fo);

程序仅返回名称为指定参数的用户。 如果我将名称设置为 Alex,那么我将不会获得名称为 alex、ALEX 等的用户 我是否需要与 morphia 做一些额外的事情才能使排序规则起作用?

【问题讨论】:

    标签: java mongodb collation morphia


    【解决方案1】:

    我有其他方法可以解决您的问题。 在查询中使用正则表达式。

    db.users.find({"name":{$regex:/^alex$/i}})

    在 java 代码中执行此操作。编写一个 java 函数,该函数将像上面一样构造字符串,例如

    {"name":{$regex:/^alex$/i}}

    并使用以下代码获取 DBCursor

    public DBCursor find(String jsonString) {
        if(StringUtils.trimToNull(jsonString) != null) {
                DBObject dbObject = (DBObject)JSON.parse(jsonString);
                return collection.find(dbObject);
        }
        return null;
    }
    

    然后从 DBCursor 获取 DBObject 列表,并使用 morphia.fromDBObject 函数在所需类中获取结果。

    您可以采用的另一种方法是在必填字段上创建文本索引并使用您想要的任何内容进行搜索。在此处查看详细信息:https://docs.mongodb.com/manual/reference/operator/query/text/#text-operator-case-sensitivity

    【讨论】:

    • 谢谢你的回答,但这个解决方案的问题是它不能使用索引,我的收藏有超过一百万的用户。使用 mongo 3.4 和排序规则使用,您可以使用 regex 做之前可以做的事情,但您也有索引。
    • 抱歉回复晚了。无法通过在必填字段上添加文本索引来完成?
    • 可以,但文本索引有其他限制,而且速度较慢
    猜你喜欢
    • 2013-05-10
    • 2016-02-03
    • 2020-01-27
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多