Java操作mongodb的模糊查询和精确查询
本意是想查查mongo数据库的int类型的like怎么查,但是好像没解决这个问题。
精确查询;模糊查询;分页查询,每页多少:按某个字段排序(或升或降):查询数量:大于,小于,等于;且,或,某个字段不为空,某个字段不存在,查询在某个范围内,删除等等查询。
一.常用查询:
1.查询一条数据:(多用于保存时判断db中是否已有当前数据,这里is 精确匹配,模糊匹配使用regex...)
publicPageUrlgetByUrl(Stringurl){ returnfindOne(newQuery(Criteria.where("url").is(url)),PageUrl.class); }
2.查询多条数据:linkUrl.id属于分级查询
publicListgetPageUrlsByUrl(intbegin,intend,StringlinkUrlid){ Queryquery=newQuery(); query.addCriteria(Criteria.where("linkUrl.id").is(linkUrlid)); returnfind(query.limit(end-begin).skip(begin),PageUrl.class); }
3.模糊查询:-----关键字---regex
publiclonggetProcessLandLogsCount(Listconditions) { Queryquery=newQuery(); if(conditions!=null&&conditions.size()>0){ for(Conditioncondition:conditions){ query.addCriteria(Criteria.where(condition.getKey()).regex(".*?\\"+condition.getValue().toString()+".*")); } } returncount(query,ProcessLandLog.class); }
最下面,我在代码亲自实践过的模糊查询,只支持字段属性是字符串的查询,你要是查字段属性是int的模糊查询,还真没辙。
4.gte:大于等于,lte小于等于...注意查询的时候各个字段的类型要和mongodb中数据类型一致
publicListgetProcessLandLogs(intbegin,intend,List conditions,StringorderField,Directiondirection) { Queryquery=newQuery(); if(conditions!=null&&conditions.size()>0){ for(Conditioncondition:conditions){ if(condition.getKey().equals("time")){ query.addCriteria(Criteria.where("time").gte(condition.getValue()));//gte:大于等于 }elseif(condition.getKey().equals("insertTime")){ query.addCriteria(Criteria.where("insertTime").gte(condition.getValue())); }else{ query.addCriteria(Criteria.where(condition.getKey()).is(condition.getValue())); } } } returnfind(query.limit(end-begin).skip(begin).with(newSort(newSort.Order(direction,orderField))),ProcessLandLog.class); } publicList getDpsLandsByTime(intbegin,intend,DatebeginDate,DateendDate){ returnfind(newQuery(Criteria.where("updateTime").gte(beginDate).lte(endDate)).limit(end-begin).skip(begin), DpsLand.class); }
查询字段不存在的数据-----关键字---not
publicListgetGoodsDetails2(intbegin,intend){ Queryquery=newQuery(); query.addCriteria(Criteria.where("goodsSummary").not()); returnfind(query.limit(end-begin).skip(begin),GoodsDetail.class); }
查询字段不为空的数据 -----关键字---ne
Criteria.where("key1").ne("").ne(null)
查询或语句:a||b -----关键字---orOperator
Criteriacriteria=newCriteria(); criteria.orOperator(Criteria.where("key1").is("0"),Criteria.where("key1").is(null));
查询且语句:a&&b -----关键字---and
Criteriacriteria=newCriteria(); criteria.and("key1").is(false); criteria.and("key2").is(type); Queryquery=newQuery(criteria); longtotalCount=this.mongoTemplate.count(query,Xxx.class);
查询一个属性的子属性,例如:查下面数据的key2.keyA的语句
vars={ key1:value1, key2:{ keyA:valueA, keyB:valueB } }; @Query("{'key2.keyA':?0}") ListfindAllBykeyA(StringkeyA);
5.查询数量:-----关键字---count
publiclonggetPageInfosCount(Listconditions){ Queryquery=newQuery(); if(conditions!=null&&conditions.size()>0){ for(Conditioncondition:conditions){ query.addCriteria(Criteria.where(condition.getKey()).is(condition.getValue())); } } returncount(query,PageInfo.class); }
查找包含在某个集合范围:-----关键字---in
Criteriacriteria=newCriteria(); Object[]o=newObject[]{0,1,2};//包含所有 criteria.and("type").in(o); Queryquery=newQuery(criteria); query.with(newSort(newSort.Order(Direction.ASC,"type"))).with(newSort(newSort.Order(Direction.ASC,"title"))); Listlist=this.mongoTemplate.find(query,WidgetMonitor.class);
6.更新一条数据的一个字段:
publicWriteResultupdateTime(PageUrlpageUrl){ Stringid=pageUrl.getId(); returnupdateFirst(newQuery(Criteria.where("id").is(id)),Update.update("updateTime",pageUrl.getUpdateTime()),PageUrl.class); }
7.更新一条数据的多个字段:
//调用更新 privatevoidupdateProcessLandLog(ProcessLandLogprocessLandLog, intcrawlResult){ Listfields=newArrayList (); List