java操作Mongodb记录

MongoDB

简介:springboot中MongoTemplate使用记录

1.1 依赖

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

1.2 yml配置文件

spring:  
	data:    
		mongodb:  
        	database: 数据库名 
			host: ip地址      
            port: 端口号(默认是27017)      
            username: 账号      
            password: 密码

集群写法:

spring:
	data:  
		mongodb:    
			uri: mongodb://user:pwd@ip1:端口,ip2:端口/数据库

1.3 依赖注入

@Autowired
MongoTemplate mongoTemplate;

1.4 插入文档

1 创建一个与数据库对应的实体类:MongoTestClazz

package com.peiyj.entity;

import lombok.Data;
import lombok.ToString;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;

@Data
@ToString
@Document("mongo_test_clazz")
public class MongoTestClazz {
    @Field(name="id")
    private Integer id;
    private String name;
    private Integer age;
    private String gender;
}

@Document:表示对应mongodb中的哪一个集合(mongodb里的集合就是mysql里的表)

@Field:表示对应文档中的域(mongodb中域就是mysql里的字段)

类名无所谓,随便起的。

如果没有对应的集合会自动生成一个集合。

如果没有对应的域(域就是mysql里的字段)mongodb也会自动生成。

2 调用MongoTemplate的方法插入文档

@Test
    public void add(){
        //把要插入的值封装到对象的属性中
        MongoTestClazz mongoTestClazz = new MongoTestClazz();
        mongoTestClazz.setId(2);
        mongoTestClazz.setName("xiaoming");
        mongoTestClazz.setAge(18);
        mongoTestClazz.setGender("男");
        //调用插入语法 insert()
      	mongoTemplate.insert(mongoTestClazz);
    }

如果实体类上没有 @Document 这个注解,调用方法可以写成:

mongoTemplate.insert(mongoTestClazz,"mongo_test_clazz");

在这里插入图片描述

2 批量添加

    @Test
    public void addList(){
        MongoTestClazz mongoTestClazz1 = new MongoTestClazz();
        mongoTestClazz1.setId(3);
        mongoTestClazz1.setName("xiaohong");
        mongoTestClazz1.setAge(19);
        mongoTestClazz1.setGender("女");

        MongoTestClazz mongoTestClazz2 = new MongoTestClazz();
        mongoTestClazz2.setId(5);
        mongoTestClazz2.setName("xiaoxiao");
        mongoTestClazz2.setAge(20);
        mongoTestClazz2.setGender("女");

        List list = Lists.newArrayList();
        //把对象放入List中
        list.add(mongoTestClazz1);
        list.add(mongoTestClazz2);
        
        mongoTemplate.insert(list,MongoTestClazz.class);
    }

调用 insert()插入List时要给定类型 :MongoTestClazz.class

1.5 删除文档

调用mongoTemplate.remove()方法 删除id为2的文档

在这里插入图片描述

    @Test
    public void del(){
        mongoTemplate.remove(
            new Query(Criteria.where("id").is(2)),
            MongoTestClazz.class);
    }

在这里插入图片描述

说明:

        Criteria criteria = new Criteria();
        criteria.where("id").is(1);
        Query query=new Query(criteria);
        mongoTemplate.remove(query,MongoTestClazz.class);

query:表示筛选条件

1.6 更新文档

更新文档可以使用 updateMulti()方法

    @Test
    public void update(){

        Query query=new Query(Criteria.where("id").is(3));

        Update update= new Update().set("name","xiaolan");

        //更新查询返回结果集的所有
        mongoTemplate.updateMulti(query, update, MongoTestClazz.class);
    }

说明:

query:表示筛选条件

update:更改的数据

1.7 查询文档

1 查询全部

    @Test
    public void query(){
        Query query = new Query();
        List<MongoTestClazz> mongoTestClazzes = 
            mongoTemplate.find(
            	query, 
            	MongoTestClazz.class
        );
        mongoTestClazzes.forEach(System.out::println);
    }

控制台输出:

MongoTestClazz(id=3, name=xiaolan, age=19, gender=)
MongoTestClazz(id=5, name=xiaoxiao, age=20, gender=)
   

说明:

query:表示筛选条件

如果筛选条件是空,则查询全部。

2 条件查询

查询id为3的文档

    @Test
    public void query1(){
        List<MongoTestClazz> mongoTestClazzes =
                mongoTemplate.find(
                        Query.query(Criteria.where("id").is(3)),
                        MongoTestClazz.class
                );
        mongoTestClazzes.forEach(System.out::println);
    }

或者

    @Test
    public void query2(){
        Criteria criteria = new Criteria();
        criteria.and("id").is(3);
        List<MongoTestClazz> mongoTestClazzes =
                mongoTemplate.find(
                        Query.query(criteria),
                        MongoTestClazz.class
                );
        mongoTestClazzes.forEach(System.out::println);
    }

3 多条件查询

查询name为xiaolan,age为19的文档

    @Test
    public void query3(){
        Criteria criteria = new Criteria();
        criteria.and("name").is("xiaolan");
        criteria.and("age").is(19);
        List<MongoTestClazz> mongoTestClazzes =
                mongoTemplate.find(
                        Query.query(criteria),
                        MongoTestClazz.class
                );
        mongoTestClazzes.forEach(System.out::println);
    }

说明:

criteria.and(字段名).is(值);

criteria的where和and不能混合使用

4 分页查询

    @Test
    public void query4(){
        //第几页
        int pageNo = 1;
        //每页显示条数
        int pageSize = 3;
        int beginIndex = (pageNo - 1) * pageSize;
        Query query = new Query();
        List<MongoTestClazz> mongoTestClazzes =
                mongoTemplate.find(
                        query.skip(beginIndex).limit(pageSize),
                        MongoTestClazz.class
                );
        mongoTestClazzes.forEach(System.out::println);
    }

5 模糊查询

查询name中包含lan的文档

String str = “lan”;

    @Test
    public void query5(){
        String str = "lan";
        Criteria criteria = new Criteria();
        criteria.and("name").regex("^.*" + str + ".*$");

        Query query = new Query(criteria);
        List<MongoTestClazz> mongoTestClazzes =
                mongoTemplate.find(
                        query,
                        MongoTestClazz.class
                );
        mongoTestClazzes.forEach(System.out::println);
    }

说明:

mongodb支持正则表达式查询

左模糊,右模糊,可自行测试。

6 排序

我在数据库添加了几条数据 查看排序比较方便

在这里插入图片描述

    @Test
    public void query6(){
        Query query = new Query();
        query.with(Sort.by(
                Sort.Order.asc("age")
        ));
        List<MongoTestClazz> mongoTestClazzs =
                mongoTemplate.find(query, MongoTestClazz.class);
        mongoTestClazzs.forEach(System.out::println);

    }

控制台打印结果:

在这里插入图片描述

多条件排序

我在数据库添加了分数这个域,并赋值:

在这里插入图片描述

先根据score排序 再根据age排序

在实体类中添加属性:

    private Integer score;
    @Test
    public void query7(){
        Query query = new Query();
        query.with(Sort.by(
                Sort.Order.desc("score"),
                Sort.Order.desc("age")
        ));
        List<MongoTestClazz> mongoTestClazzs =
                mongoTemplate.find(query, MongoTestClazz.class);
        mongoTestClazzs.forEach(System.out::println);

    }

控制台输出:

在这里插入图片描述

7 聚合操作aggregate自定义排序

把年龄为12 或者 score 为7和2的排在最上面,再根据age排序

用法类似sql的case when

//mongodb java代码自定义排序
    @Test
    public void query8() {
        ConditionalOperators.Cond cond = ConditionalOperators.when(
                Criteria.where("age").is(12))
                .then(999)
                .otherwise(ConditionalOperators.when(
                        Criteria.where("score").in(7,2))
                        .then(999)
                        .otherwise(777));
        Integer pageNo = 1;
        Integer pageSize = 10;
        int beginIndex = (pageNo - 1) * pageSize;
        String orderTypeName = "";
        Sort by = null;
        orderTypeName = "age";
        by = Sort.by(
                Sort.Order.desc("aaa")
                , Sort.Order.desc(orderTypeName)
        );
        Criteria criteria = new Criteria();
        Aggregation agg = Aggregation.newAggregation(
                Aggregation.match(criteria)
                , Aggregation.project("id", "name", "age", "gender","score")
                        .and(cond).as("aaa")
                , Aggregation.sort(by)
                , Aggregation.skip(beginIndex)
                , Aggregation.limit(pageSize)
        );
        AggregationResults<MongoTestClazz> mongoTestClazzes =
                mongoTemplate.aggregate(agg, "mongo_test_clazz", MongoTestClazz.class);
        mongoTestClazzes.getMappedResults().forEach(System.out::println);
    }

控制台输出:

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值