How to query mongodb with “like” using the java api?

30,884

Solution 1

You need to pass an instance of a Java RegEx (java.util.regex.Pattern):

BasicDBObject q = new BasicDBObject();
q.put("name",  java.util.regex.Pattern.compile(m));
dbc.find(q);

This will be converted to a MongoDB regex when sent to the server, as well as any RegEx flags.

Solution 2

To make it case insensitive:

Document doc = new Document("name", Pattern.compile(keyword, Pattern.CASE_INSENSITIVE));
collection.find(doc);

Solution 3

You must first quote your text and then use the compile to get a regex expression:

q.put("name",  Pattern.compile(Pattern.quote(m)));

Without using java.util.Pattern.quote() some characters are not escaped.

e.g. using ? as the m parameter will throw an exception.

Solution 4

Document doc = new Document("name", Pattern.compile(keyword));
collection.find(doc);

Solution 5

In spring data mongodb, this can be done as:

Query query = new Query();
query.limit(10);        
query.addCriteria(Criteria.where("tagName").regex(tagName));
mongoOperation.find(query, Tags.class);
Share:
30,884
Khon Lieu
Author by

Khon Lieu

Updated on January 23, 2020

Comments

  • Khon Lieu
    Khon Lieu over 4 years

    this question is very similar to another post

    I basically want to use the mongodb version of the sql "like" '%m%' operator

    but in my situation i'm using the java api for mongodb, while the other post is using mongodb shell

    i tried what was posted in the other thread and it worked fine

    db.users.find({"name": /m/})
    

    but in java, i'm using the put method on the BasicDBObject and passing it into the find() method on a DBCollections object

    BasicDBObject q = new BasicDBOBject();
    q.put("name", "/"+m+"/");
    dbc.find(q);
    

    but this doesn't seem to be working.

    anyone has any ideas?