2015-09-22 7 views
10
私はJavaでこのクエリを実行する必要が

のJavaのMongoDBは、正規表現のクエリ

db.Users.find({"name": /^ind/i}) 

私のJavaコードは、それがどのようなデータを返すされていない

Document findQuery = new Document(); 
findQuery.append("name", Pattern.compile("/^"+name+"/i")); 
FindIterable<Document> iterable = db.getCollection("Users").find(findQuery); 

ですが、私は上記のJavaコードが

を変換していると思います
> /^ind/i into "/^ind/i" 

ありがとうございます。

編集: stribizhev提案更新クエリとその働い

db.Users.find({"name": {"$regex": /^ind/, "$options": "i"}}) 

Javaコードに基づいて

Document regQuery = new Document(); 
regQuery.append("$regex", "^(?)" + Pattern.quote(name)); 
regQuery.append("$options", "i"); 

Document findQuery = new Document(); 
findQuery.append("name", regQuery); 
FindIterable<Document> iterable = db.getCollection("Users").find(findQuery); 
+2

を見ることができる正規表現区切り文字を使用しないように

Pattern regex = Pattern.compile("ind", Pattern.CASE_INSENSITIVE); Bson filter = Filters.eq("name", regex); 

オブジェクトパターンは、いくつかの他のフラグを持っています。/^ "+ name +"/i "'の代わりに '' ^(?i) "+ Pattern.quote(name)'を試してください。 –

+0

ありがたいことに、それは基本的に "^(?)" + Pattern.quote( "ind")に変換された値を^(?)\ Qind \ E – Indrajeet

+0

に変換しました。私は答えとして提案を掲載しました。 –

答えて

5

があるとしてあなたは、JavaのPattern.compileで正規表現区切り文字を使用することはできません同じことをするためのJavaの他の手段(例えばフラグ)。

大文字と小文字を区別しない検索を実行するには、インライン修飾子(?i)を使用します。したがって、 "/^"+name+"/i"の代わりに"^(?i)"+Pattern.quote(name)を使用してください。

Pattern.quoteは、すべての正規表現メタ文字をリテラルとして扱うようにエスケープします(\Q ... \Eと同じです)。

Document query = new Document("equipment","gloves"); 

//whatever pattern you need. But you do not need the "/" delimiters 
String pattern = ".*" + query.getString("equipment") + ".*"; 

//find(regex("field name", "pattern", "options")); 
collection.find(regex("equipment", pattern, "i")); 
+0

はい、まさに私もmongoクエリを更新しました。 db.Users.find({"name":{"$ regex":/^ind /、 "$ options": "i"}}) Javaコードは です。Document regQuery = new Document(); \t \t \t \t regQuery.append( "$ regex"、 "^(?)" + Pattern.quote(name)); \t \t \t \t regQuery.append( "$ options"、 "i"); – Indrajeet

+0

このコードを最終的に質問に追加することができます。 –

1

あなたはパターン - およびFilters-を使用することができます。私はJavaで、提供するMongoDBのJavaドライバーフィルターでの(上記のバージョン3と)を使用していることを行うにはよりエレガントな方法があると思い