如何使用不区分大小写的方式索引mongodb中的用户名?

时间:2012-08-08 13:38:20

标签: mongodb

我正在编写一个Web服务,用户可以选择一个必须不区分大小写的用户名。但是,我想允许他们使用区分大小写的用户名。

在插入时检查用户名没有不区分大小写的副本的最佳方法是什么?我目前看到了两种方法:

  • 使用用户输入的案例存储小写版本和另一个版本,并仅索引小写版本
  • 只存储用户输入的案例版本,并将其小写用于比较,这违背了我认为的索引的目的

有更好的方法吗?

4 个答案:

答案 0 :(得分:10)

存储最初输入的用户名和规范版本(适用于您应用的小写)非常合理。只要确保在设置用户名时在模型中更新规范字段,并通过规范字段的唯一索引检查约束违规。

此解决方案(原始和规范字段)有意义的另一种情况是文章,其中可能会重复使用相同的标题,但slug(对于URL)必须是唯一的。

答案 1 :(得分:4)

MongoDB 3.4现在包含了制作真正不区分大小写的索引的能力。它是通过指定强度为2的归类来完成的。

最简单的方法可能是在数据库本身上设置排序规则。然后所有查询都继承该排序规则并将使用它:

-assumenosideeffects class android.util.Log {
    public static boolean isLoggable(java.lang.String, int);
    public static int v(...);
    public static int i(...);
    public static int d(...);
}

或者您可以按索引编制索引:

db.createCollection("cities", { collation: { locale: 'en_US', strength: 2 } } )
db.cities.createIndex( { city: 1 } ) // inherits the default collation
db.cities.find({city:"new york"}) //inherits default collation

并像这样使用它:

db.myCollection.createIndex({city: 1}, {collation: {locale: "en", strength: 2}});

了解更多信息:https://jira.mongodb.org/browse/SERVER-90

答案 2 :(得分:2)

似乎mongodb将支持 3.4 (即将发布)不区分大小写的索引。请参阅此ticketcollation的文档。

在上述故障单中获得的示例中,我们看到在collationcreateIndex中使用{strong>强度为2 的find执行了一个案例-insensitve搜索:

> db.myCollection.createIndex({city: 1}, {collation: {locale: "en", strength: 2}});
> db.myCollection.insert({_id: 1, city: "New York"});
> db.myCollection.insert({_id: 2, city: "new york"});
> db.myCollection.find({city: "new york"}).collation({locale: "en", strength: 2});
{ "_id" : 1, "city" : "New York" }
{ "_id" : 2, "city" : "new york" }

答案 3 :(得分:-1)

索引与它没有任何关系,索引可以更快地查找(搜索)。

db.userTable.find( { storedUserName: /^userEnteredUserName$/i } );

请参阅https://www.google.co.uk/search?q=mongodb+case+insensitive+search