MongoDB模糊查询带括号的数据
首先贴一个Mongo的模糊查询语法:
// 注意有括号是要加转义符的
db.getCollection("PUB_ORG_INFO").find({"ORG_CHI_NAME": /^.*乌鲁木齐普瑞眼科医院\(有限公司\).*$/i})
最近使用MongoDB查询酒店基础静态信息时,碰到了这个问题,最终解决后记录一下,以下为部分代码:
1、对查询字符串转义,以处理输入为regex的特定字符(同时允许输入以数字开头的模糊查询):
HotelUtil类:
/**
* mongo模糊查询 转义工具
*/
public static 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;
}
2、使用Criteria:
HolMidServiceImpl类:
public Page<AggregateHotel> productManagementList(HotelListSearchReq hotelSearchReq, PageVO pageVO) {
int curPage = pageVO.getCurPage(); // 当前页
int rowNum = pageVO.getRowNum(); // 每页多少行
String resId = hotelSearchReq.getResId(); // 酒店id
String cityName = hotelSearchReq.getCityCode(); // 城市
String resGradeId = hotelSearchReq.getResGradeId(); // 星级
String keyword = hotelSearchReq.getKeyword(); // 酒店名称
String protocol = hotelSearchReq.getProtocol(); // 协议酒店
Query query = new Query();
Criteria criteria = new Criteria();
if (StringUtil.isNotBlank(resId)) {
criteria.and("hotelId").is(Long.parseLong(resId));
}
if (StringUtil.isNotBlank(cityName)) {
criteria.and("cityName").is(cityName);
}
if (StringUtil.isNotBlank(resGradeId)) {
criteria.and("hotelStar").is(Long.parseLong(resGradeId));
}
if (StringUtil.isNotBlank(keyword)) {
keyword = keyword.replace("(", "(").replace(")", ")");
String hotelName = HotelUtil.escapeExprSpecialWord(keyword);
criteria.and("hotelName").regex("^.*" + hotelName + ".*$");
}
if (StringUtil.isNotBlank(protocol) && "1".equals(protocol)) {
criteria.and("protocol").is(true);
}
query.addCriteria(criteria);
// 总条数
int total = (int) mongoTemplate.count(query, "collectionName");
query.limit(rowNum);
query.skip((curPage - 1) * rowNum);
List<AggregateHotel> records = mongoTemplate.find(query, AggregateHotel.class, "collectionName");
Page<AggregateHotel> page = new Page<>(curPage, rowNum);
page.setRecords(records);
page.setTotal(total);
return page;
}