8

ユーザーが大文字と小文字を区別しない一意のユーザー名を選択できる Web サービスをコーディングしています。ただし、ユーザー名の大文字と小文字を区別するバージョンを使用できるようにしたいと考えています。

ユーザー名に大文字と小文字を区別しない重複がないことを挿入時に確認する最良の方法は何ですか? 現在、これを行うには2つの方法があります。

  • 小文字バージョンとユーザーが入力した大文字と小文字の別のバージョンの両方を保存し、小文字バージョンのみをインデックス化する
  • ユーザーが入力した大文字と小文字のバージョンのみを保存し、比較のために小文字にします。これは、インデックスの目的を無効にすると思います

より良い方法はありますか?

4

4 に答える 4

10

最初に入力したユーザー名と正規バージョン (アプリでは小文字) を保存することは、まったく合理的です。ユーザー名が設定されるたびにモデルで正規フィールドが更新されることを確認し、正規フィールドの一意のインデックスを介して制約違反を確認してください。

このソリューション (元のフィールドと正規フィールド) が理にかなっている別のシナリオは、同じタイトルが再利用される可能性がありますが、(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

mongodb はバージョン3.4 (まもなくリリース)から大文字と小文字を区別しないインデックス作成をサポートするようです。このチケットcollat​​ionのドキュメントを参照してください。

上記のチケットから取得した例では、と の両方で強度 2collationを使用すると、大文字と小文字を区別しない検索が実行されることがわかります。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 に答える