1. 程式人生 > >spring boot MongoTemplate如何 對 mongodb 進行模糊查詢

spring boot MongoTemplate如何 對 mongodb 進行模糊查詢

以下為部分程式碼片段,供參考。

1: 程式碼片段1,用Pattern方式來實現 不區分大小寫的匹配(包括精確和模糊匹配)

//完全匹配
Pattern pattern = Pattern.compile("^張$", Pattern.CASE_INSENSITIVE);
//右匹配
Pattern pattern = Pattern.compile("^.*張$", Pattern.CASE_INSENSITIVE);
//左匹配
Pattern pattern = Pattern.compile("^張.*$", Pattern.CASE_INSENSITIVE);
//模糊匹配
Pattern pattern = Pattern.compile("^.*張.*$", Pattern.CASE_INSENSITIVE);
Query query = Query.query(Criteria.where(fieldName).regex(pattern));  
List<SimpleUserInfo> users = mongoTemplate.find(query, SimpleUserInfo.class, classname);
return users;

2、對查詢字串轉義,以處理輸入為regex的特定字元(同時允許輸入以數字開頭的模糊查詢)。

程式碼片段A:

//regex對輸入特殊字元轉義

String escapeExprSpecialWord(String keyword) {

if (StringUtils.isNotBlank(keyword)) {

String[] fbsArr = { "\\", "$", "(", ")", "*", "+", ".", "[", "]", "?", "^", "{", "}", "|" };

for (String key : fbsArr) {

if (keyword.contains(key)) {
  keyword = keyword.replace(key, "\\" + key);
    }
  }
}

 return keyword;
}

以下部分為controller及repository兩部分核心程式碼,在controller中將查詢條件拼裝成 SpringBoot MongoTemplate的Criteria物件 

給service\repository處理。

程式碼片段B:,criteria物件就是實現對filed1 和 filed2的模糊匹配

//m.get("parma1")為前端傳入引數param1

Pattern pattern = Pattern.compile(".*?" + escapeExprSpecialWord(m.get("field1").toString()) + ".*");

Criteria criteria=Criteria.where("field1").regex(pattern);

pattern = Pattern.compile(".*?" + escapeExprSpecialWord(m.get("field2").toString()) + ".*");

criteria.and("field2").regex(pattern);

3. 對於子查詢elemmatch的處理

查詢各文章一直都未成功,不知道怎麼回事,我是採用以下方式解決:

  • 對映類中按collection結構設定,對子集不要設定為map而是設定子類

  • 查詢中直接使用a.b即可查詢

例:collection結構為{id:XXX,content:XXX,project:{id:XXX,name:XXX}}

程式碼片段如下:

public class Ticket extends BaseEntity implements java.io.Serializable {

@Id

private String id;

private String content;

private Project project; //定義Project類以匹配collection中的project欄位

……

}

 

class Location{

long id;

String name;

}

 

//查詢project.id=1的記錄

Criteria.where("project.id").is(1);

//查詢project.name包含武漢的記錄

Criteria.where("project.name").regex(".*?武漢.*"); //如從前端獲取有特定字元的查詢條件或以數字開頭的查詢條件請使用前面說的轉義方法處理