2011-04-09 3 views
30

cette question est très similaire à un autre postComment interroger mongodb avec "like" en utilisant l'API Java?

Je veux essentiellement utiliser la version mongodb du sql « comme » opérateur « % de m% »

mais dans ma situation j'utilise l'api java pour MongoDB, tandis que l'autre poste utilise shell mongodb

j'ai essayé ce qui a été écrit dans l'autre fil et il a bien fonctionné

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

mais en java, j'utilise la méthode de vente sur le BasicDBObj ect et passer dans la méthode find() sur un DBCollections objectera

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

mais cela ne semble pas fonctionner.

quelqu'un a des idées?

Répondre

63

Vous devez passer une instance d'un Java RegEx (java.util.regex.Pattern):

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

Ce sera converti en un regex MongoDB lorsqu'il est envoyé au serveur, ainsi que tous les drapeaux RegEx.

+0

+1 littéralement sauvé ma santé mentale. J'ai cherché comment faire une expression rationnelle négative, car l'opérateur $ not ne fait pas exception à $ regex – kommradHomer

1

En données printemps MongoDB, cela peut se faire comme:

Query query = new Query(); 
query.limit(10);   
query.addCriteria(Criteria.where("tagName").regex(tagName)); 
mongoOperation.find(query, Tags.class); 
2

Vous devez d'abord citer votre texte puis utilisez la compilation pour obtenir une expression regex:

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

Sans utiliser java.util.Pattern.quote() certains les caractères ne sont pas échappés.

par exemple. en utilisant ? car le paramètre m lèvera une exception.

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

Pour le rendre insensible à la casse:

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

peut-être pas la réponse réelle, (exécution de la requête de terminal directement)

public void displayDetails() { 
    try { 
     // DB db = roleDao.returnDB(); 
     MongoClient mongoClient = new MongoClient("localhost", 5000); 
     DB db = mongoClient.getDB("test"); 
     db.eval("db.test.update({'id':{'$not':{'$in':[/su/]}}},{$set:{'test':'test3'}},true,true)", new Object[] {}); 
     System.out.println("inserted "); 

    } catch (Exception e) { 
     System.out.println(e); 
    } 
} 
Questions connexes