MongoDB——非关系型数据库总结

MongoDB

一、非关系型数据库-NoSQL

相较于传统的sql数据库,非关系型数据库没有复杂的表结构,不再满足ACID,而是采用key-value的方式对数据进行存储。

NoSQL的优点:

1.现如今分布式系统越来越普及,用户的数据量越来越多,就需要对数据库的容量和硬件进行升级,而Nosql数据之间无关系,有很好的横向扩展性。

2.大数据量高性能(Redis秒写8w,秒读11w),NoSQL的缓存是记录级,是一种细粒度的缓存,性能会比较高

  1. 数据类型是多样型的(不需要事先去设计数据库),随取随用

二、mongoDB

mongoDB采用json和文档的方式存储数据

引入mongoDB

1.添加依赖

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

2.添加配置

在application.xml中

spring:
  data:
	  mongodb:
      uri: mongodb://localhost:27017/test
	#      uri: mongodb://opc_mongo:123456@198.19.4.55:27017/opc_mongo
#url: jdbc:mysql://192.168.2.153:3306/pocp_haijing1?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&zeroDateTimeBehavior=convertToNull

简单CRUD

@RestController
@RequestMapping("mongodb")
public class test {
    @Autowired
    public MongoTemplate mongoTemplate;
    @Test

    @PostMapping("insert")
    public void mongoInsert(){
        student student=new student();
        student.setName("阿毅");
        student.setAge(24);
        student.setSex(2);
        List<String> list=new ArrayList<>();
        list.add("游戏");
        list.add("运动");
        student.setHobby(list);
        Map map=new HashMap<>();
        map.put("蜥蜴","小橘子");
        map.put("专业","软件工程");
        String str=JSON.toJSONString(map);
        Object jsonObject = JSON.parseObject(str);
        student.setOther(jsonObject);
        mongoTemplate.insert(student);
    }

    @PostMapping("delete")
    public void mongoDelete(){
        Query query=new Query(Criteria.where("name").is("阿璇"));
        mongoTemplate.remove(query,student.class);
    }

    @PostMapping("update")
    public void mongoUpdate(){
        Criteria criteria=Criteria.where("name").is("阿毅");

        Query query=new Query(criteria);
        Update update=new Update();
        update.set("age","25");
        //只更新第一条
//        mongoTemplate.updateFirst(query,update,student.class);
        //更新所有
        mongoTemplate.updateMulti(query,update,student.class);

    }

    @PostMapping("select")
    public List mongoSelect(@RequestParam(required = false) String item,@RequestParam(required = false) String data){
        Criteria criteria=Criteria.where("name").is("阿毅").and("age").regex("^.*"+"3"+".*$") ;

        if (data!=null) {//当一个字段被多条件约束 就需要用到andOperator,andOperator只能运行一次,所以采用criteriaList
            List<Criteria> criteriaList=new ArrayList<>();
            Criteria criteria2 = Criteria.where(item).is(data);
            criteriaList.add(criteria2);
            Criteria criteria3 = Criteria.where("name").ne(null).ne("");
            criteriaList.add(criteria3);
            criteria.andOperator(criteriaList);
        }

        Query query=new Query(criteria);

        List list=mongoTemplate.find(query ,student.class);
        return list;
    }

    @PostMapping("selectByPage")
    public List mongoSelect(@RequestParam(required = false) String item,@RequestParam(required = false) String data,
                            @RequestParam(required = false,defaultValue = "1") Integer pageNumber,
                            @RequestParam(required = false,defaultValue = "10")Integer pageSize){
        Criteria criteria=Criteria.where("name").regex(".*?"+"阿"+".*").and("age").ne(null) ;

        Sort sort=Sort.by(Sort.Direction.DESC,"age");
        Pageable pageable= PageRequest.of(pageNumber-1,pageSize,sort);
        if (data!=null) {//当一个字段被多条件约束 就需要用到andOperator,
            List<Criteria> criteriaList=new ArrayList<>();
            Criteria criteria2 = Criteria.where(item).is(data);
            criteriaList.add(criteria2);
            Criteria criteria3 = Criteria.where("name").ne(null).ne("");
            criteriaList.add(criteria3);
            criteria.andOperator(criteriaList);
        }
        Query query=new Query(criteria);
        query.with(pageable);
        List list=mongoTemplate.find(query ,student.class);
        return list;
    }
}

聚合和管道

使用前我们先来了解一下常用的函数

Aggregation.group() : 聚合函数,将某个字段或者某个数组作为分组统计的依据,在group的基础上又扩展出以下函数:

sum() : 求和
max() : 获取最大值
min() : 获取最小值
avg() : 获取平均值
count() : 统计条目数
first () : 获取group by 后的某个字段的首个值
last() : 获取 group by 后的某个字段的最后一个值
push() : 在结果文档中插入值到一个数组中
addToSet() : 在结果文档中插入值到一个数组中,但不创建副本(作为集合)。
Aggregation.match() : 过滤函数,主要存储过滤数据的条件,输出符合条件的记录

Aggregation.project(): 修改数据结构函数,将前面管道中的获取的字段进行重名,增加,修改字段等操作。

Aggregation.unwind():将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。当preserveNullAndEmptyArrays为true时,将包括字段为null,空,或者缺失的数据;

Aggregation.sort(): 排序函数,将上级管道的内容按照某个字段进行排序并且输出。值为1升、-1降。sort一般放在group后,也就是说得到结果后再排序,如果先排序再分组没什么意义;

Aggregation.limit(): 限制输出函数,将聚合返回的内容限定在某个条目之内。通常作为页面大小

Aggregation.skip(): 跳过指定数量的条目再开始返回数据的函数,通常和sort(),limit()配合,实现数据翻页查询等操作。

Aggregation.lookup(): 连表查询,将被关联集合添加到执行操作的集合中

match

Aggregation aggregation = Aggregation.newAggregation(
        Aggregation.match(new Criteria().and("userId").is("a")
);

project

java:
// 初始化聚合
Aggregation aggregation = Aggregation.newAggregation(
    	Aggregation.group(new String[] {"_id"}).sum("num").as("num")
	    	.first("name").as("firstName")
	    	.last("name").as("lastName"),
	Aggregation.project("_id", "num", "firstName")
                .and("lastName").as("name") // 重新命名字段
);

unwind拆分数组

Aggregation aggregation = Aggregation.newAggregation(
    Aggregation.match(new Criteria().and("userId").is("a"),
    Aggregation.unwind("items",true)
);

sort skip limit处理数据:

Aggregation aggregation = Aggregation.newAggregation(
    	Aggregation.group("accountId", "status")
	Aggregation.sort(Direction.DESC, "num"),		//将num降序
	Aggregation.skip(10),					//从第10条记录开始
	Aggregation.limit(2)					//取两条数据
);

lookup多表关联查询:

# Mongo:
db.getCollection('mro_accounts').aggregate([
    {
        $lookup: {
            from:"mro_profiles",   # 被关联表名
            localField:"userName", # 主表(mro_accounts)中用于关联的字段
            foreignField:"mobile", # 被关联表(mro_profiles)中用于关联的字段
            as:"profileDoc"        # 被关联的表的别名
            }
        }
])
# Java
Aggregation aggregation = Aggregation.newAggregation(
    	Aggregation.lookup("mro_profiles", "userName", "mobile", "profileDoc") //分别对应from, localField, foreignField, as
);

match+group

        Criteria criteria=Criteria.where("name").regex(".*?"+"阿"+".*")  ;
        if (data!=null) {//当一个字段被多条件约束 就需要用到andOperator,
            List<Criteria> criteriaList=new ArrayList<>();
            Criteria criteria2 = Criteria.where(item).is(data);
            criteriaList.add(criteria2);
            Criteria criteria3 = Criteria.where("name").ne(null).ne("");
            criteriaList.add(criteria3);
            criteria.andOperator(criteriaList); 
        }
        Aggregation aggregation=Aggregation.newAggregation( Aggregation.match(criteria),Aggregation.group("sex").sum("age").as("age").first("name").as("name").first("hobby").as("hobby").first("other").as("other").first("sex").as("sex"));
        List<student> list=mongoTemplate.aggregate(aggregation,"student",student.class).getMappedResults();

获取查询结果

在创建好Aggregation对象之后,再用 mongotemplate.aggregate(aggregation, "mro_fn_subscribes", Fnsubscribe.class).getMappedResults() 获取查询的对象列表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值