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
DBObject A = QueryBuilder.start("name").is(Pattern.compile("ab", 
                                       Pattern.CASE_INSENSITIVE)).get();

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

于 2014-02-17T11:48:48.313 回答
0

使用子句的代码片段$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 ..       
}

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

于 2012-04-15T09:46:18.553 回答
0

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

但是,要执行您需要的操作,您有 2 种可能性:

  1. 正如您在问题中提到的,第一个使用正则表达式。而且我相信这是最好的解决方案
  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 回答