MongoDB模糊查询带括号的数据
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;}