8

我正在编写一个网络服务,用户可以在其中选择一个用户名,该用户名必须是不区分大小写的唯一用户名。但是,我想允许他们使用区分大小写的用户名版本。

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

  • 存储用户输入的小写版本和另一个版本,并仅索引小写版本
  • 仅存储带有用户输入的大小写的版本并将其小写以进行比较,这违背了我认为索引的目的

有没有更好的办法?

4

4 回答 4

10

存储最初输入的用户名和规范版本(应用程序的小写)是完全合理的。只需确保在设置用户名时更新模型中的规范字段,并通过规范字段的唯一索引检查是否违反约束。

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

于 2012-08-08T14:43:22.443 回答
4

MongoDB 3.4 现在包括创建真正不区分大小写的索引的能力。它是通过指定强度为 2 的排序规则生成的。

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

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}});

并像这样使用它:

db.myCollection.find({city: "new york"}).collation({locale: "en", strength: 2});

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

于 2016-12-01T15:41:20.853 回答
2

3.4版(即将发布)开始,mongodb 似乎将支持不区分大小写的索引。请参阅此票证整理文档。

在从上述票证中获得的示例中,我们看到在and中collation使用强度为 2,执行不区分大小写的搜索:createIndexfind

> 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" }
于 2016-11-07T19:41:09.230 回答
-1

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

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

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

于 2012-08-08T14:04:43.890 回答