cette question est très semblable à une autre post
Je souhaite utiliser la version mongodb de l'opérateur sql "like" '% m%'
mais dans ma situation, j'utilise l'api Java pour mongodb, tandis que l'autre post utilise mongodb Shell
j'ai essayé ce qui a été posté dans l'autre fil et cela a bien fonctionné
db.users.find({"name": /m/})
mais en Java, j'utilise la méthode put sur le BasicDBObject et le passe dans la méthode find () sur un objet DBCollections
BasicDBObject q = new BasicDBOBject();
q.put("name", "/"+m+"/");
dbc.find(q);
mais cela ne semble pas fonctionner.
quelqu'un a des idées?
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);
Cela sera converti en une regex MongoDB lorsqu’il sera envoyé au serveur, ainsi que tous les drapeaux RegEx.
Vous devez d’abord citer votre texte, puis utiliser la compilation pour obtenir une expression regex:
q.put("name", Pattern.compile(Pattern.quote(m)));
Sans utiliser Java.util.Pattern.quote()
certains caractères ne sont pas échappés.
par exemple. utiliser ?
comme paramètre m
lève une exception.
Pour le rendre insensible à la casse:
Document doc = new Document("name", Pattern.compile(keyword, Pattern.CASE_INSENSITIVE));
collection.find(doc);
Dans les données de printemps mongodb, cela peut être fait comme suit:
Query query = new Query();
query.limit(10);
query.addCriteria(Criteria.where("tagName").regex(tagName));
mongoOperation.find(query, Tags.class);
Document doc = new Document("name", Pattern.compile(keyword));
collection.find(doc);
Peut-être pas la réponse réelle, (Exécuter directement la requête du terminal)
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);
}
}