2012-04-14 5 views
2

Derzeit bin ich mit Java zu MongoDB verbinden, ich diese SQL-Abfrage in mongodb mit Java-Treiber schreiben möchten:Wie kann man mongodb mit "like" abfragen, indem man die Java API ohne Pattern Matching verwendet?

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

ist ihr jede Lösung die gleiche Aufgabe durch java, die Abfrage in mongodb auszuführen ist sehr einfach, ich weiß, ist die Abfrage

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

aber wie in Java gleiche Aufgabe auszuführen

Strom I Muster sind mit Anpassung der Aufgabe und Code auszuführen ist

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

aber es macht Abfrage sehr langsam glaube ich, existiert eine Lösung, die nicht Pattern-Matching nicht verwendet?

Antwort

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

Ich denke, dies ist eine der möglichen Lösung, müssen Sie Index erstellen, um diese zu erreichen.

0

Warum fürchten Sie die regulären Ausdrücke? Sobald der Ausdruck kompiliert ist, sind sie sehr schnell, und wenn der Ausdruck "ab" ist, ähnelt das Ergebnis einer Funktion, die einen Teilstring in einer Zeichenkette sucht.

jedoch zu tun, was Sie brauchen, Sie haben 2 Möglichkeiten:

  1. Die ersten, regulären Ausdruck, wie Sie in Ihrer Frage erwähnen. Und ich glaube, das ist die beste Lösung.
  2. Die zweite, mit der $wherequeries.

Mit $where Abfragen können Sie Ausdruck wie diese

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

angeben und so können Sie die JavaScript .indexOf() auf String-Felder verwenden.

0

-Code snippet die $regex-Klausel (wie durch mikeycgto erwähnt)

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

Solange Sie nicht Öffnen und Schließen der Verbindung pro Methodenaufruf, sollte die Abfrage schnell sein.