如何使用java api在不使用模式匹配的情况下使用“like”查询mongodb?

时间:2012-04-14 05:07:54

标签: java jsp mongodb servlets

目前我正在使用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 个答案:

答案 0 :(得分:1)

可以使用正则表达式。看看以下内容:

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

确保您了解潜在的性能影响!

答案 1 :(得分:0)

为什么你害怕正则表达式?编译表达式后,它们非常快,如果表达式为“ab”,则结果类似于搜索字符串中子字符串的函数。

然而,为了做你需要的事,你有两种可能:

  1. 第一个,使用正则表达式,正如您在问题中提到的那样。 我相信这是最好的解决方案
  2. 第二个,使用$where queries
  3. 使用$where个查询,您可以指定类似

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

    因此您可以在字符串字段上使用JavaScript .indexOf()

答案 2 :(得分:0)

代码snippet使用 $regex 条款(如 mikeycgto 所述)

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 ..       
}

只要您不打开和关闭每个方法调用的连接,查询就应该很快。

答案 3 :(得分:0)

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

我认为这是可能的解决方案之一,您需要创建索引来实现这些目标。