MongDB中使用正则表达式进行模糊匹配查询,查询的都是一个整个的字段。这里我要先说明一下我的这个需求,mongo中保存的数据是这样的:
{
"_id": "07c90f18-ce11-42d1-95bf-bd161f7d1dce",
"_class": "com.monitor.model.logVo",
"requestParam": "sId:1;pId:1380;proId:-1;pcount:1;",
"createTime": ISODate("2018-10-07T16:04:47.082Z")
}
/* 2 */
{
"_id": "bb588697-6604-4c6e-858d-a3725e70cd5e",
"_class": "com.monitor.model.logVo",
"requestParam": "sId:1;pId:1381;proId:-1;pcount:1;pclassific:2;",
"createTime": ISODate("2018-10-07T16:06:20.700Z")
}
/* 3 */
{
"_id": "3033d1ca-2441-4ca1-9ef1-0ee5bcdc00e2",
"_class": "com.monitor.model.logVo",
"requestParam": "sId:1;pId:1381;proId:-1;pcount:1;pclassific:2;",
"createTime": ISODate("2018-10-07T16:06:21.765Z")
}
/* 4 */
{
"_id": "57f8e9f1-05dd-49e7-b23a-6b4ab1b13f66",
"_class": "com.monitor.model.logVo",
"requestParam": "sId:102;pId:1280;proId:-1;pcount:1;",
"createTime": ISODate("2018-10-07T16:06:26.519Z")
}
我要做的就是查询requestParam字段中:pid不是数字的记录有多少。这的话直接匹配整个字段肯定是不行的,要匹配requestParam字段中的“pid:1390”部分。需要用正则表达式匹配pid不全是数字。经过百度方法和查询正则表达式,终于尝试出来一种方法:
在mongoDB中查询的时候的写法:
db.getCollection('accessLogVo20180917').find(
{'requestParam':{$regex:/pid:(?!([0-9])+)/,$options:'i'}}]
)
java代码中的写法:
Query query=new Query();
String str="pid:(?!([0-9])+)";
// String str="pid://D+"; //查不出来数据
Pattern pattern = Pattern.compile(str, Pattern.CASE_INSENSITIVE);
query.addCriteria(Criteria.where("requestParam").regex(pattern));
List<AccessLogVo> find = mongoTemplate.find(query, AccessLogVo.class, "accessLogVo20180917");
long count = mongoTemplate.count(query, "accessLogVo20180917");
System.out.println(count);
System.out.println(find);
在这里解释一下这个正则表达式:(?!([0-9])+),
[0-9]:匹配一个数字字符。
(?!pattern):非,匹配不符合pattern的字符。
+:匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。
所以总的来说就是匹配pid不是数字的记录。