2011-04-09 74 views
30

這個問題是非常相似的另一個post如何使用java api查詢「like」的mongodb?

我基本上要使用sql的MongoDB的版本「喜歡」「%M%」運算符

,但在我的情況我使用Java API的MongoDB的,而其他崗位使用MongoDB的外殼

我試了一下被張貼在其他線程和它工作得很好

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

但在Java中,我使用的BasicDBObj put方法並將其傳遞到DBCollections對象上的find()方法中

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

但這似乎不起作用。

任何人有任何想法?

回答

63

你需要通過一個Java正則表達式(java.util.regex.Pattern)的一個實例:

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

這將被轉換爲正則表達式的MongoDB時發送到服務器,以及任何正則表達式標誌。

+0

+1字面上救了我的理智。我一直在尋找如何做一些負面的正則表達式,因爲$ not操作符不會除$ regex外 – kommradHomer 2015-07-27 15:32:38

1

春季數據MongoDB中,這是可以做到的:

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

您必須首先引用您的文字,然後用編譯得到一個正則表達式:

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

不使用java.util.Pattern.quote()一些字符不會被轉義。

例如使用?作爲m參數將引發異常。

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

爲了使它不區分大小寫:

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

可能不是實際的答案,(直接執行終端查詢)

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); 
    } 
}