2017-02-22 8 views
1

私はmongo 3.4サーバーを持っており、大文字と小文字を区別しないクエリを実行する必要があります。 適切なインデックスを作成しました。mongoコンソールで大文字と小文字を区別しないクエリを作成できます。 Morphiaは照合を無視します

db.users.find( {"name": "alex" }, { "name" : 1 }).collation({ locale: 'en', strength: 2 }) 

は名前アレックス、アレックス、ALEXとして持つすべてのユーザーを返すなど

私はmorphia 1.3.1を使用して、私のJavaプログラムから同じことを行う必要があります。

Collation col = Collation.builder().locale("en").collationStrength(CollationStrength.SECONDARY).build(); 
    FindOptions fo = new FindOptions().collation(col); 
    q.disableValidation().asList(fo); 

プログラムは、指定されたパラメータの名前を持つユーザーのみを再試行します。 名前をAlexとして設定した場合、名前がalex、ALEXなどのユーザーを取得できません 照合を機能させるためにmorphiaと何か関係があったのでしょうか?

答えて

0

あなたの問題を解決する別の方法があります。 クエリで正規表現を使用します。

db.users.find({ "名前":{$の正規表現:/ ^アレックス$/I}})

Javaコードでこれを行うにしてください。上記のような文字列を作成する1つのJava関数を記述します。

{ "名前":{$の正規表現:/ ^アレックス$/I}}

とのDBcursor

public DBCursor find(String jsonString) { 
    if(StringUtils.trimToNull(jsonString) != null) { 
      DBObject dbObject = (DBObject)JSON.parse(jsonString); 
      return collection.find(dbObject); 
    } 
    return null; 
} 

を取得するためのコードの下に使用後のDBcursorからDBObjectをのリストを取得morphia.fromDBObject関数を使用して、必要なクラスで結果を取得します。

別の方法として、必要なフィールドにテキストインデックスを作成し、必要なものを検索することができます。詳細はこちらをご覧ください:https://docs.mongodb.com/manual/reference/operator/query/text/#text-operator-case-sensitivity

+0

ありがとうございますが、このソリューションの問題はインデックスを使用できないことと、私のコレクションには100万人を超えるユーザーがいることです。 mongo 3.4と照合の使い方では、正規表現でこれまでにできることはできますが、インデックスも持っています。 –

+0

遅く応答して申し訳ありません。必要なフィールドにテキストインデックスを追加することはできませんか? –

+0

テキストインデックスには他の制限がありますが、テキストインデックスにはより遅い –

関連する問題