MongoDB中使用正则表达式匹配查询

    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不是数字的记录。

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值