2

現在、Javaを使用してMONGODBに接続していますが、Javaドライバーを使用してmongodbでこのSQLクエリを記述したいと思います。

select * from tableA where name like("%ab%")

Javaを介して同じタスクを実行するためのソリューションです。mongodbのクエリは非常に単純です。クエリは次のとおりです。

db.collection.find({name:/ab/})

しかし、Javaで同じタスクを実行する方法

現在、私はパターンマッチングを使用してタスクを実行しており、コードは

DBObject A = QueryBuilder.start("name").is(Pattern.compile("ab", 
                                           Pattern.CASE_INSENSITIVE)).get();

しかし、クエリが非常に遅くなると思いますが、パターンマッチングを使用しないソリューションは存在しますか?

4

4 に答える 4

1

正規表現を使用できます。以下を見てください。

http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-RegularExpressions

潜在的なパフォーマンスへの影響を必ず理解してください。

于 2012-04-14T05:10:16.643 に答える
0

なぜ正規表現を恐れるのですか?式がコンパイルされると、それらは非常に高速になり、式が「ab」の場合、結果は文字列内の部分文字列を検索する関数に似ています。

ただし、必要なことを行うには、次の2つの可能性があります。

  1. 最初のものは、質問で述べたように、正規表現を使用しています。そして、これが最善の解決策だと思います
  2. 2つ目は、$where クエリを使用します。

クエリを使用$whereすると、次のような式を指定できます

db.foo.find({"$where" : "this.x + this.y == 10"})
db.foo.find({"$where" : "function() { return this.x + this.y == 10; }"})

.indexOf()したがって、文字列フィールドでJavaScriptを使用できます。

于 2012-04-14T08:51:42.013 に答える
0

句を使用したコードスニペット( mikeycgtoで言及されているように)$regex

String searchString = "ab";
DBCollection coll = db.getCollection("yourCollection");
query.put("name", 
  new BasicDBObject("$regex", String.format(".*((?i)%s).*", searchString)) );
DBCursor cur = coll.find(query);
while (cur.hasNext()) {
  DBObject dbObj = cur.next();
  // your code to read the DBObject ..       
}

メソッド呼び出しごとに接続を開いたり閉じたりしない限り、クエリは高速である必要があります。

于 2012-04-15T09:46:18.553 に答える
0
DBObject A = QueryBuilder.start("name").is(Pattern.compile("ab", 
                                       Pattern.CASE_INSENSITIVE)).get();

これは可能な解決策の1つだと思います。それらを実現するには、インデックスを作成する必要があります。

于 2014-02-17T11:48:48.313 に答える