mangodb----java中的代码

前言:便于学习,整理了各路上的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转换成前面需要的类型.....
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值