MongoDB - 强制存储的值为大写和搜索

时间:2012-05-03 14:37:20

标签: mongodb mongodb-query

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

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

这将匹配搜索“Smith”,“SMITH”,“SmiTH”等...因为它强制查询和值是相同的情况。

但是,如果不使用RegEx,MongoDB似乎没有这种功能,RegEx不会使用索引,而且对于大量数据来说会很慢。

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

我遇到过$ toUpper聚合,但我无法弄清楚在这种特殊情况下如何使用它。

如果在搜索之前无法转换存储的值,是否可以让MongoDB在Mongo中创建时转换一个值?因此,当我向集合添加文档时,它会强制将“name”属性强加给特定情况吗?像Rails世界中的回调一样。

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

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

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

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

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