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