我正在编写一个Web服务,用户可以选择一个必须不区分大小写的用户名。但是,我想允许他们使用区分大小写的用户名。
在插入时检查用户名没有不区分大小写的副本的最佳方法是什么?我目前看到了两种方法:
有更好的方法吗?
答案 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}});
答案 2 :(得分:2)
似乎mongodb将支持 3.4 (即将发布)不区分大小写的索引。请参阅此ticket和collation的文档。
在上述故障单中获得的示例中,我们看到在collation
和createIndex
中使用{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