Java中使用Mongodb查询语句

基本查询语句

//
Criteria cri =new Criteria();
//另一种方式,为query加入cri,在query实例化的时候为其赋值
//new Query(criatira)
//new Query(Criteria.where("id").is(id))
//MongoTemplate().find(new Query(), clazz);
Query query=new Query();
query.addCriteria(cri);
MongoTemplate().find(query, Model.class);

当有多个查询条件时,我们需要构造Criteria[]数组,两种方式

  1. 直接赋值,这种方式缺点在于每一条查询语句中,只能够赋值一次,意思就是,在声明Criteria[]数组的时候,就必须进行赋值,后面的操作就不可再进行赋值。如下例子:
Criteria cri =new Criteria();
Criteria[] cri1 = {Criteria.where("score").lte(max),Criteria.where("creditScored").gte(min)};
cri.andOperator(cri1);
  1. 通过List方式添加条件,这种方式可以一个条件一个条件的依次添加,多用于对条件进行筛选的时候使用。如下例子:
List<Criteria> condition=new LinkedList<Criteria>();
if(!StringUtils.isEmpty(id)){
	condition.add(Criteria.where("id").is(id));
}
if(!StringUtils.isEmpty(inputsName)){
	condition.add(Criteria.where("inputName").regex(inputsName));
}
condition.add(Criteria.where("isDelete").is(1));
Criteria[] cri=condition.toArray(new Criteria[condition.size()]);

注意:这两种方式产生的原因是,数组在声明的时候,必须为其分配内存,必须指定其长度,而且List的长度则是可以变化的。在查询条件确定的时候,采用数组形式;在查询条件需要判断的时候,采用List形式。

Criteria语句的常用法

大于小于: 大于(gt) 小于(lt) 大于等于(gte) 小于等于(lte

Criteria.where("score").lte(max),Criteria.where("score").gte(min) 
//连在一起写
Criteria.where("score").lte(max).gte(min)

不存在某个字段

Criteria.where("userTitle").ne(null)

不等于:

//userName不等于空
Criteria.where("userName").ne("");

模糊查询:

Criteria.where("number").regex(number)

根据字段排序:

query.with(new Sort(new Order(Direction.DESC,String))); //倒序
query.with(new Sort(new Order(Direction.ASC,String))); //顺序

or(与sql中的or同样的):

	//该方法不是Criteria的静态方法,必须使用对象实例调用
	Criteria criatira = new Criteria()
	criteria.orOperator(criteriaA,criteriaB,criteriaC,criteriaD);
	//第二种
	new Criteria().orOperator(Criteria.where("updateStatus").is(-1),
				Criteria.where("updateStatus").is(2))};

and(与sql中的and同样的):

Criteria criatira = new Criteria();
	criatira.andOperator(cri);
		
	//同时加入多个:
	criteria.andOperator(criteriaA,criteriaB,criteriaC,criteriaD);
	//错误写法: 一个查询语句中,不能出现两个criteria.andOperator()方法 ,or方法也一样
	criteria.andOperator(criteriaA,criteriaB);
	criteria.andOperator(criteriaC,criteriaD);
	//加入数组
	Criteria[] cri1 = {Criteria.where("score").lte(max),Criteria.where("creditScored").gte(min)};
	criteria.andOperator(cri1);
补充一种:根据条件查询,并且返回指定列,加入排序
public List<T> findSomeColumn(Map<String, Object> conditions,Map<String, Object> columns,
			String sortStr,int how) throws Exception{
		//BasicDBObject是BSON的子类,方法更加完善
		//查询条件
		BasicDBObject condition=new BasicDBObject();
		for(Map.Entry<String, Object> entry : conditions.entrySet()) {  
			condition.append(entry.getKey(),entry.getValue());  
		}  
		//指定需要显示列  
		BasicDBObject key=new BasicDBObject();
		for(Map.Entry<String, Object> entry : columns.entrySet()) {  
			key.append(entry.getKey(),entry.getValue());  
		}
		Query query=new BasicQuery(condition,key);
		
		//根据某个字段排序,如果how=1就是desc,how=2就是asc
		if(how==1){
			query.with(new Sort(new Order(Direction.DESC,sortStr)));
		}else{
			query.with(new Sort(new Order(Direction.ASC,sortStr)));
		}
		
		return getMongoTemplate().find(query, clazz);
	}
分组统计查询

这个例子可以加入查询筛选条件,加入分组依赖的字段,固定显示多少行数据(limit),根据某个字段进行排序,分组求和等。

public JSONArray GroupByTempName(String enterpriseId) throws Exception {
		// TODO Auto-generated method stub
		//加入查询筛选条件
		BasicDBObject matherTimer=new BasicDBObject("enterpriseObj.$id",new ObjectId(enterpriseId)); //因为enterpriseObj对象加了@DBRef标签
		//多个条件
//		DBObject queryObject2 = new BasicDBObject();
//		BasicDBObject queryObject1=new BasicDBObject("uploadTime", new BasicDBObject("$gte",startTime+" 00:00:00").append("$lte",endTime+" 23:59:59"));  
//        if (!StringUtils.isEmpty(enterpriseId)) {
//        	queryObject2 = queryObject1.append("enterpriseId", enterpriseId);
//		}else {
//			queryObject2 = queryObject1;
//		}
		DBObject matcher1=new BasicDBObject("$match",matherTimer);
		
		//加入分组条件
		BasicDBObject groupId=new BasicDBObject();
		groupId.append("tempName","$tempName");  //分组字段  $tempName表示数据库字段   tempName字段为自定义名称字段,可以加入多组分组依据
		DBObject groupEnterpriseId=new BasicDBObject("_id",groupId); //_id为固定命名,不可更改
		//groupEnterpriseId.put("total", new BasicDBObject("$sum","$productAmount"));  //分组统计数据库字段$productAmount的和
		//groupEnterpriseId.put("batchTotal", new BasicDBObject("$sum",1));   //统计该组数据的总数,batchTotal为自定义字段名
	    DBObject  group1=new BasicDBObject("$group",groupEnterpriseId);
	    
	    //加入排序字段
//	    BasicDBObject sortSimpleProductTotal=new BasicDBObject();
//	    sortSimpleProductTotal.append("$sort",new BasicDBObject("_id.total",-1));  // _id指的是上面的id,不是数据库主键。  total是上面查询出来的字段
	    
	    //加入查询条数
//	    BasicDBObject limitNum =new BasicDBObject("$limit",20);
	    
	    List<DBObject>  list=(List<DBObject>)getMongoTemplate().getCollection("templateInfoData").aggregate(matcher1,group1).results();
	    //如果加了排序字段和查询条数,则使用下面的语句
	    //List<DBObject>  list=(List<DBObject>)getMongoTemplate().getCollection("batch").aggregate(matcher1,group1,sortSimpleProductTotal,limitNum).results();
	    JSONArray dataArray = new JSONArray();
	    for(DBObject obj:list){
	    	dataArray.add(obj);
	    }
	    return dataArray;
		 
	}
  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值