【问题标题】:MongoDB - forcing stored value to uppercase and searchingMongoDB - 将存储的值强制为大写并搜索
【发布时间】:2012-05-03 14:37:19
【问题描述】:

在 SQL 世界中,我可以做一些事情:

SELECT name FROM table WHERE UPPER(name) = UPPER('Smith');

这将匹配对“Smith”、“SMITH”、“SmiTH”等的搜索...因为它强制查询和值大小写相同。

但是,如果不使用 RegEx,MongoDB 似乎没有此功能,它不会使用索引,并且对于大量数据会很慢。

有没有办法在 MongoDB 中对存储的值进行搜索之前将其转换为特定的情况?

我遇到过 $toUpper 聚合,但我不知道在这种特殊情况下如何使用它。

如果在搜索之前无法转换存储的值,是否可以让 MongoDB 在 Mongo 中创建值时对其进行转换?因此,当我将文档添加到集合中时,它会强制将“名称”属性用于特定情况吗?类似于 Rails 世界中的回调。

看起来也可以为 MongoDB 创建存储的 JS,类似于存储过程。这也是一个可行的解决方案吗?

主要是在寻找正确方向的推动力;一旦我知道我在寻找什么,我就可以找出特定的代码,但到目前为止我什至不确定我想要的功能是否可行。

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    您必须在存储数据之前对其进行规范化。不支持在运行时将规范化作为查询的一部分。

    【讨论】:

    • 这就是我部分害怕的。我正在使用 MongoImporter 工具加载一些数据,因此在将数据摄入 MongoDB 之前,我并没有一种方便的方法来规范化数据。看起来我可能必须在最终加载之前做另一份做一些中间工作的工作。
    【解决方案2】:

    最简单的做法可能是保存您要搜索的字段的大小写规范化(即全大写)和显示版本。假设您正在存储用户并希望对姓氏进行不区分大小写的搜索。您可以存储:

    {
        _id: ObjectId(...),
        first_name: "Dan",
        last_name: "Crosta",
        last_name_upper: "CROSTA"
    }
    

    然后您可以在last_name_upper 上创建索引,并查询如下:

    > db.users.find({last_name_upper: "CROSTA"})
    

    【讨论】:

    • 那将是一个更好的解决方案,但是我使用的是 MongoImporter,并且当我批量加载它时并没有真正访问像这样操作数据的权限。在应用程序本身中创建的项目可以执行此操作,但不能执行初始批量导入。这是一个很好的解决方案,但它不适用于我的特殊情况。
    猜你喜欢
    • 2019-11-08
    • 2022-12-20
    • 1970-01-01
    • 2019-07-02
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    相关资源
    最近更新 更多