SpringBoot整合MongoDB

MongoDB是一个基于分布式文件存储 [1]  的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。

MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似jsonbson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引

特点

它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有:

mongodb集群参考

*面向集合存储,易存储对象类型的数据。

*模式自由。

*支持动态查询

*支持完全索引,包含内部对象。

*支持查询。

*支持复制和故障恢复。

*使用高效的二进制数据存储,包括大型对象(如视频等)。

*自动处理碎片,以支持云计算层次的扩展性。

*支持 GolangRUBYPYTHONJAVAC++PHPC#等多种语言。

*文件存储格式为BSON(一种JSON的扩展)。

*可通过网络访问。
分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。分布式文件系统的设计基于客户机/服务器模式。一个典型的网络可能包括多个供多用户访问的服务器。另外,对等特性允许一些系统扮演客户机和服务器的双重角色。 [2] 

MongoDB服务端可运行在LinuxWindows或mac os x平台,支持32位和64位应用,默认端口为27017。推荐运行在64位平台,因为MongoDB在32位模式运行时支持的最大文件尺寸为2GB。

新建springboot项目,并导入相关依赖

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

yml配置文件

spring:
  data:
    mongodb:
      uri: mongodb://192.168.198.129:27017/baizhi


#如果存在密码,使用下面这个(开启用户名密码校验)

#host: 192.168.198.129:27017
#  port: 27017
#  database: baizhi
#  username: root
#  password: 123456

server:
  port: 7878

uri参数解释 : 协议://mongodb地址/库名

新建User实体类,此处采用Lombok简化开发

@Data
@AllArgsConstructor
@NoArgsConstructor
@Document("users")//这个类的实例就代表mongo中一条文档
public class User {
    @Id//用这个类的id映射文档的_id
    private Integer id;
    @Field("username")
    private String name;
    @Field
    private Double salary;
    @Field
    private Date birthday;
}

创建集合 

    //创建集合
    @Test
    void contextLoads() {
        //判断这个集合在数据库中是否存在
        boolean product = mongoTemplate.collectionExists("product");
        if (!product) {
            //创建集合
            mongoTemplate.createCollection("product");
        }
    }

删除集合 

//删除集合
    @Test
    void testDropCollection(){
        //集合不存在,删除也不会报错
        mongoTemplate.dropCollection("product");
    }

添加文档 

    //文档操作 添加
    @Test
    void testadd(){
        User user = new User(5, "王献之", 2100.1, new Date());
        //save方法在主键存在时是更新操作
//        mongoTemplate.save(user);
        //insert方法主键存在时,会报错,主键冲突
        mongoTemplate.insert(user);
    }

 添加文档二

    //文档操作  批量增加
    @Test
    void testinsertMany(){
        List<User> users = Arrays.asList(new User(3, "干将莫邪3", 2300.1, new Date()), new User(4, "干将莫邪4", 2300.1, new Date()));
        mongoTemplate.insert(users,User.class);//参数一:批量数据的集合,参数二:这个集合的类型
    }

查询所有文档 

    //文档操作   查询
    @Test
    void testFind(){
        //查询所有
        List<User> all = mongoTemplate.findAll(User.class);
        all.forEach(System.out::println);
    }

主键查询 

    @Test
    void testFindById(){
        User byId = mongoTemplate.findById(1, User.class);
        System.out.println("byId = " + byId);
    }

 文档操作   所有复杂查询

    //文档操作  条件查询
    @Test
    void testFind2(){
        //查询全部  参数一:查询条件  参数二:返回的类型
        List<User> users = mongoTemplate.find(new Query(), User.class);
        users.forEach(System.out::println);

        //等值查询
        Query query = Query.query(Criteria.where("name").is("干将莫邪"));
        List<User> users = mongoTemplate.find(query, User.class);
        users.forEach(System.out::println);

        // > < <= >= 查询
        List<User> users = mongoTemplate.find(Query.query(Criteria.where("salary").gt(2600.1)), User.class);
        users.forEach(System.out::println);

        // and 查询
        List<User> users = mongoTemplate.find(Query.query(Criteria.where("name").is("干将莫邪").and("salary").is(2500.1)), User.class);
        users.forEach(System.out::println);

        //or 查询
        Criteria criteria = new Criteria();
        criteria.orOperator(
                Criteria.where("name").is("干将莫邪"),
                Criteria.where("name").is("干将莫邪3")
//                Criteria.where("salary").lte(2600.1)
        );
        List<User> users = mongoTemplate.find(Query.query(criteria), User.class);
        users.forEach(System.out::println);

        //and or 查询
        List<User> users = mongoTemplate.find(Query.query(Criteria.where("salary").is(2600.1).orOperator(Criteria.where("name").is("干将莫邪2"))), User.class);
        users.forEach(System.out::println);

        //排序查询
        Query querySort = new Query();
        querySort.with(Sort.by(Sort.Order.asc("salary")));
        List<User> users = mongoTemplate.find(querySort, User.class);
        users.forEach(System.out::println);

        //分页查询
        Query querySort = new Query();
        querySort.with(Sort.by(Sort.Order.asc("salary")))
                .skip(1)
                .limit(2);
        List<User> users = mongoTemplate.find(querySort, User.class);
        users.forEach(System.out::println);
    }

        //查询总条数
        long count = mongoTemplate.count(Query.query(Criteria.where("name").is("干将莫邪")), User.class);
        System.out.println("count = " + count);

        //去重查询
        List<String> name = mongoTemplate.findDistinct(new Query(), "name", User.class, String.class);
        name.forEach(System.out::println);
    }

更新操作 

 //更新操作
    @Test
    void testUpdate(){
        //更新符合条件的第一条数据
//        Update update = new Update();
//        update.set("salary",4000.1);
//        mongoTemplate.updateFirst(Query.query(Criteria.where("name").is("干将莫邪")), update,User.class);

        //多条更新
//        mongoTemplate.updateMulti(Query.query(Criteria.where("name").is("干将莫邪"),update,User.class);



        //插入更新 没有符合条件数据的时候插入数据
        Update update = new Update();
        update.setOnInsert("id",10);
        update.set("salary",4000.1);
        UpdateResult salary = mongoTemplate.upsert(Query.query(Criteria.where("salary").is(10000.1)), update, User.class);

        //获取修改的数据
        salary.getModifiedCount();
        //获取本次匹配的记录数
        salary.getMatchedCount();
        //如果没有匹配的数据,获取新增的ID
        salary.getUpsertedId();

    }

删除操作 


    //删除操作
    @Test
    void testDelete(){
        //删除所有
//        mongoTemplate.remove(new Query(), User.class);
        //条件删除
        mongoTemplate.remove(Query.query(Criteria.where("name").is("干将莫邪3")),User.class);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张谦谦s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值