2012-05-03 4 views
1

を検索:のMongoDB - 大文字に格納された値を強制的に、私はの効果に何かを行うことができますSQLの世界で

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

と、これは「スミス」、「SMITH」、「SMITH」の検索に一致するだろう、これは、クエリと値が同じ場合に強制されるためです。

しかし、MongoDBはインデックスを使用せず、大量のデータに対しては遅くなるRegExを使用しないと、この機能を持たないようです。

保存された値をMongoDBで検索する前に特定のケースに変換する方法はありますか?

私は$ toUpper集約を見つけましたが、この特定のケースでどのように使用されるかわかりません。

検索する前に保存された値を変換する方法がない場合、MongoDBがMongoで作成されたときに値を変換することは可能ですか?コレクションにドキュメントを追加すると、「名前」属性が特定のケースに強制されます。 Railsの世界ではコールバックのようなものです。

ストアドプロシージャと同様に、MongoDB用にストアドJSを作成する機能があるようです。それは実現可能な解決策でもありますか?

ほとんどの場合、正しい方向にプッシュを探します。一度私が探しているものを知ったら、特定のコードを理解することができますが、これまでのところ、私の望む機能が実行可能かどうかはわかりません。

答えて

2

データを保存する前に正規化する必要があります。実行時に照会の一部として正規化を実行することはサポートされていません。

+0

。私はMongoImporterツールを使用してデータの一部を読み込んでいますので、MongoDBに取り込まれる前にデータを正規化する便利な手段はありません。私は最終的に読み込む前に、いくつかの中途半端な仕事をしなければならないかもしれないように見えます。 –

2

最も単純なことは、検索するフィールドの大文字と小文字の正規化(つまり大文字)と表示バージョンの両方を保存することです。ユーザーを格納していて、姓で大文字と小文字を区別しない検索を実行するとします。あなたは、保存可能性があります

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

その後、last_name_upperにインデックスを作成し、同様に問い合わせることができます:私はの一部が恐れていたものです

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

これはもっと良い解決策ですが、私はMongoImporterを使用しており、バルクでロードするときにこのようなデータを操作するためのアクセス権を実際に持っていません。アプリで作成されたアイテムはこれを行うことができますが、最初の一括インポートはできません。これは良い解決策ですが、私の場合はうまくいかないでしょう。 –

+0

追加エントリを作成するために一括更新を行うことができます。 – sventechie

関連する問題