前言:便于学习,整理了各路上的mangodb在java中编译代码模式
一、使用构造函数Query (Criteria criteria)
SpringData MongoDB 提供了find方法,方便我们通过java代码实现对MongoDB的查询操作:
mongoTemplate.find (query, entityClass)//entityClass对应实体类
Criteria为借口,其内部提供的where可以把条件连接起来
//---查询单个条件
mongoTemplate.find (new Query(Criteria.where("onumber").is("002")),entityClass)
//---查询多个条件and,在第一个条件后跟着and连接即可
mongoTemplate.find (new Query(Criteria.where("onumber").is("002").and("cname").is("zcy")),entityClass)
/*
and也可以替换成andOperator,方式跟下面的orOperator类似!!
但是,一个Criteria中只能有一个andOperator,and可以多个,我们查询并列条件时,比较建议使用and方法。*/
//---查询多个条件or
mongoTemplate.find(newQuery(newCriteria().orOperator(Criteria.where("onumber").is("002"),Criteria.where("cname").is("zcy"))),entityClass);
二、构造方法 BasicQuery(DBObject queryObject)
常用底层子类 BasicDBObject();
//语句db.collect.find({"onumber":"002"}) 如下
DBObject obj = new BasicDBObject();
obj.put( "onumber","002" );
//in 的用法
obj.put("patient_id", new BasicDBObject("$in", patientIdList));
//设置字段排序 1表示升序,-1表示倒序
objSort.put("survey_time", 1);
//exists 用法 1 代表存在该字段,字段值为 null的也算
obj.put("time_point_id", new BasicDBObject("$exists", 1));
//大于小于的用法
obj.put("time", (new BasicDBObject("$gte", startTime)).append("$lte", endTime));
//查询结果
MongoCursor<Document> cursor =
mongoTemplate.getCollection("表名").find(obj).sort(objSort);
//遍历
List<TestEntity> list=new ArrayList<>();
while (cursor.hasNext()) {
DBObject object=cursor.next();
TestEntity te=new TestEntity();
te.setId(object.get("_id").toString());
te.setTime((Date) object.get("time"));
list.add(te);
}
扩展:
BasicDBList可以存放多个BasicDBObject条件
//例如:我们查询onumber=002OR cname=zcy1
BasicDBList basicDBList=new BasicDBList();
basicDBList.add(new BasicDBObject("onumber","002"));
basicDBList.add(new BasicDBObject("cname","zcy1"));
DBObject obj =new BasicDBObject();
obj.put("$or", basicDBList);
Query query=new BasicQuery(obj);
//相当于
db.orders.find({$or:[{"onumber":"002"},{"cname":"zcy1"}]})
使用BasicDBObject和BasicDBList可以解决大多数的查询问题
建议参考:添加链接描述
目前所发现:使用BasicDBObject要比Query (Criteria criteria)查询效率更快,自己还未验证,等待结果出来!!
三、多表联查
参考:添加链接描述
mongo查询语句:
db.getCollection('A').aggregate([
{
$lookup:{
from:'B',
localField:'userid',
foreignField:'userid',
as:'userinfo'
}
},
{
$unwind:'$userrole'//把一个数组展成多个,就比如说按多表连查的userrole数组中有10数据,那么用$unwind将把一条带数组的数据分成10条,这10条数据除了userrole不同之外,其它数据都是相同的,就类似于一个展开操作
},
{
$match:{'username':'zhangsan'}
},
{
$group:{
_id:{
userid:'$userid',//这个属性必须是要A表中有的
userrole:'$userrole.roleid',//A表中有一个集合,里面存放的对象有一个名为roleid的属性
},
operateTime:{
$last:'$operateTime'//取A表操作时间最后一条件数
}
info:{
$first:'$userinfo'//因为数组的扩展,造成了大量的重复数据(只有userrole不同),$first是只取最新的一条
}
}
},
{
$sort:{'operateTime':-1}//操作时间倒序,-1:倒序,1:升序
},
{
$skip:0//跳过几条数据,也就是从第几条数据开始取
},
{
$limit:5//每页显示几条数据
}
]);
上面都是各种条件,下面是java中的
//定义分组字段
String[] groupIds = new String[] {"$userid","$userrole.roleid"};
//定义查询条件
Criteria criteria = new Criteria();
//相当于where username = "zhangsan"
criteria.and("username").is("zhangsan");
//相当于 where age not in("15","20")
criteria.and("age").nin("15","20");
//in操作对应的语句
//criteria.and("").in();
//定义排序条件
Sort sort = new Sort(Direction.DESC,"operateTime");
//联合查询总条数,分页用
Aggregation aggregationCount = Aggregation.newAggregation(
Aggregation.match(criteria);//查询条件
Aggregation.group(groupIds);//分组字段
);
//联合查询条件
Aggregation newAggregation = Aggregation.newAggregation(
Aggregation.lookup('B','userid','userid','userinfo'),//从表名,主表联接字段,从表联接字段,别名
Aggregation.unwind("$userrole"),
Aggregation.match(criteria),
Aggregation.group(groupIds)
.last("$operateTime").as("operateTime")//取值,起别名
.first("$userinfo").as("info"),
Aggregation.sort(sort),
Aggregation.skip(pageSize*(pageNumber-1L)),//Long类型的参数
Aggregation.limit(pageSize)
);
//查询
AggregationResults<BasicDBObject> aggregate = mongoTemplate.aggregate(
newAggregation ,"A",BasicDBObject.class//A表,是查询的主表
);
int count = mongoTemplate.aggregate(aggregationCount ,"A",BasicDBObject.class).getMappedResults().size();
//组装分页对象
Page<BasicDBObject> pager = new Page<>(aggregate.getMappedResults(),count,pageSize,pageNumber,page*(pageNumber-1));
//对象转换
将BasicDBObject转换成前面需要的类型.....