sprinngboot+Mongodb

官网: https://www.mongodb.com/docs/mongodb-shell/crud/insert/

来源: https://blog.csdn.net/m0_46742141/article/details/121845098   (亲测可用)

 

maven依赖

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

spring-data-mongodb提供了MongoTemplate与MongoRepository两种方式访问mongodb,

MongoRespository操作简单
MongoTemplate操作灵活

 

配置文件

application.yml

spring
    data
        mongodb
            uri: mongodb://47.103.24.101:27017/test

 

实体类

@Data
@Document("User")//实体和mongo中集合collect对应
public class User {
    @Id        -----加这个获取默认自增的id
    private String id;
    private String name;
    private Integer age;
    private String email;
    private String createDate;
}

 

实现类

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

//注入MongoTemplate
    @Autowired
    private MongoTemplate mongoTemplate;
    //添加数据
    @Test
    public void create(){
        User user=new User();
        user.setAge(20);
        user.setName("zhangsan");
        user.setEmail("123@qq.com");
        User user1 = mongoTemplate.insert(user);
        System.out.println(user1);
    }
        //查询全部数据
    @Test
    public void findAll(){
        List<User> list = mongoTemplate.findAll(User.class);
        System.out.println(list);
    }
    //根据id查询
    @Test
    public void findById(){
        User user = mongoTemplate.findById("61b4776540a252406bba6b18", User.class);
        System.out.println("查询数据"+user);
    }
    //条件查询
    @Test
    public void findUserList(){
        Query query=new  Query(Criteria.where("name").is("zhangsan").and("age").is(20));
        List<User> users = mongoTemplate.find(query, User.class);
        System.out.println(users);
    }
    //模糊查询
    @Test
    public void findLikeUserList(){
        String name="san";
        String regex=String.format("%s%s%s",".*",name,".*$");
        Pattern pattern=Pattern.compile(regex,Pattern.CASE_INSENSITIVE);//Pattern.CASE_INSENSITIVE :设置常量
        Query query=new Query(Criteria.where("name").regex(pattern));
        List<User> list=mongoTemplate.find(query,User.class);
        System.out.println(list);
    }
    //条件查询带分页
    @Test
    public void findUserPageList(){
        int pageNo=1;
        int pageSize=3;
        //条件构建
        String name="san";
        String regex=String.format("%s%s%s",".*",name,".*$");
        Pattern pattern=Pattern.compile(regex,Pattern.CASE_INSENSITIVE);//Pattern.CASE_INSENSITIVE :设置常量
        Query query=new Query(Criteria.where("name").regex(pattern));
        //分页构建
        //查询记录数
        long count = mongoTemplate.count(query, User.class);
        //分页
        List<User> list = mongoTemplate.find(query.skip((pageNo - 1) * pageSize).limit(pageSize), User.class);
        System.out.println(list);
    }
    //修改
    @Test
    public void updateUser(){
        User user = mongoTemplate.findById("61b4776540a252406bba6b18", User.class);
        //设置修改值
        user.setName("test");
        user.setAge(100);
        user.setEmail("8888@qq.com");
        //调用实现方法
        Query query=new Query(Criteria.where("_id").is(user.getId()));
        Update update=new Update();    ---这个是mogo第三方库的对象
        update.set("name",user.getName());
        update.set("age",user.getAge());
        update.set("email",user.getEmail());
        UpdateResult upsert = mongoTemplate.upsert(query, update, User.class);
        long modifiedCount = upsert.getModifiedCount();
        System.out.println(modifiedCount);
    }
可以修改一条或者全部的见: https://www.cnblogs.com/xuxiaojian/p/14408856.html#2%E6%9B%B4%E6%96%B0%E6%95%B0%E6%8D%AE
Criteria criteria = Criteria.where("title").is(title);
            Query query = new Query(criteria);
//          Query query = new Query();
//          query.addCriteria(Criteria.where("title").is(title));
            Update update = new Update().set("topRank",top);
//更新满足条件的第一条数据
            mongoTemplate.updateFirst(query,update,GuShiCi.class);
//更新满足条件的所有数据
            mongoTemplate.updateMulti(query,update,GuShiCi.class);


    //删除
    @Test
    public void deleteUser(){
        Query query =new Query(Criteria.where("_id").is("61b49556f54e8f08aa7fcf93"));
        DeleteResult remove = mongoTemplate.remove(query, User.class);
        long count = remove.getDeletedCount();
        System.out.println(count);
    }

//统计数量
Query query = new Query(Criteria.where("gradeTypeId").is(gradeTypeId));
return mongoTemplate.count(query,BiBeiMingJu.class);

 

 

基于MongoRepository开发CRUD

创建interface的接口,继承MongoRepository类

public interface UserRepository extends MongoRepository<User,String> {

}

 

实现类

//注入MongoTemplate
@Autowired
private UserRepository userRepository;
//添加方法
@Test
public void create(){
    User user =new User();
    user.setAge(50);
    user.setName("lucsse");
    user.setEmail("3333@qq.com");
    User save = userRepository.save(user);
    System.out.println(save);
}
//查询全部数据
@Test
public void findAll(){
    List<User> list = userRepository.findAll();
    System.out.println(list);
}
//根据id查询
@Test
public void findById(){
    User user = userRepository.findById("61b49ff67d773a2e9587aeff").get();
    System.out.println(user);
}
//条件查询
@Test
public void findUserList(){
    User user =new User();
    user.setAge(30);
    user.setName("lucy");
    Example<User> example=Example.of(user) ;
    List<User> all = userRepository.findAll(example);
    System.out.println(all);
}
//模糊查询
@Test
public void findLikeUserList(){
    //设置模糊查询匹配规则
    ExampleMatcher matcher=ExampleMatcher.matching()
            .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING)//ExampleMatcher.StringMatcher.CONTAINING :表示设置模糊查询
            .withIgnoreCase(true);
    User user =new User();
    user.setName("c");
    Example<User> example=Example.of(user,matcher) ;
    List<User> all = userRepository.findAll(example);
    System.out.println(all);
}
//条件查询带分页
@Test
public void findUserPageList(){
    //设置分页参数
    Pageable pageable = PageRequest.of(0, 3);
    User user =new User();
    user.setName("lucy");
    Example<User> example=Example.of(user) ;
    Page<User> page = userRepository.findAll(example, pageable);
    page.getTotalPages();
    System.out.println(page);
}
//修改
@Test
public void updateUser(){
    User user = userRepository.findById("61b4a30c3db5d039fda97e60").get();
    user.setName("ssssss");
    user.setAge(100);
    user.setEmail("55555@qq.com");
    //save(),方法有id则修改,无id则添加
    User save = userRepository.save(user);
    System.out.println(save);
}



//删除
@Test
public void deleteUser(){
    userRepository.deleteById("61b4a30c3db5d039fda97e60");
}

 

注意:要用比较运算的话要先指定数字类型

Long aa=1662226682000L;
Query query=new Query(Criteria.where("createdtime").gte(aa).lte(aa));
List<BugMeassge> users = mongoTemplate.find(query, BugMeassge.class);
System.out.println(users);

gte 大于等于  lte小于等于

gt 大于    lt小于

is 等于

 

mongo配置参考:

https://blog.csdn.net/qq_36324685/article/details/82621156

 

在控制台输出nosql的日志

在application.yml中添加

logging:
  level:
    org:
      springframework:
        data:
          mongodb:
            core: DEBUG

 

 

 

分组聚合函数

 

https://www.jb51.net/article/236826.htm

  

  去重排序见 https://blog.csdn.net/web18224617243/article/details/126114329

  聚合函数参考: https://blog.csdn.net/web18224617243/article/details/126114329

 

例子:

//从mongodb里获取满足条件的记录   status:状态 1:上架  2:下架
        Criteria criteria = Criteria.where("status").is("new");
        //聚合函数查询统计信息
        Aggregation aggregation = Aggregation.newAggregation(
                // 挑选所需的字段,类似select *,*所代表的字段内容--要包含分组的字段和下面需要用到的字段
                Aggregation.project("title", "status","createdtime","id"),
                // sql where 语句筛选符合条件的记录
                Aggregation.match(criteria),
                // 分组条件,设置分组字段
                Aggregation.group("status")
                        .first("title").as("title")
                        .first("id").as("id")
                        .count().as("total")
                        .sum("createdtime").as("createdtime"),
                //按照total降序
                Aggregation.sort(Sort.Direction.DESC,"total")
        );
        AggregationResults<Map> aggregationResults = mongoTemplate.aggregate(aggregation,BugMeassge.class,Map.class);
        List<Map> list = aggregationResults.getMappedResults();

        System.out.println(list);

输出:
[{_id=new, title=【test】测试, id=1148699533001085067, total=2, createdtime=3324453364000}]




/*
 * project:列出所有本次查询的字段,包括查询条件的字段和需要搜索的字段;
 * match:搜索条件criteria
 * unwind:某一个字段是集合,将该字段分解成数组
 * group:分组的字段,以及聚合相关查询
 * sum:求和(同sql查询)
 * count:数量(同sql查询)
 * as:别名(同sql查询)
 * addToSet:将符合的字段值添加到一个集合或数组中
 * sort:排序
 * skip&limit:分页查询
 */



Aggregation.group(field1, field2).last(sortName).as(sortName)
group 是指要分组的字段
last是指保留最后一条评论的记录
as是其别名


Aggregation.group("zc2003004").first("zc2003004").as("zc2003004").count().as("allCount").sum("zc2003008").as("sum"),
已"zc2003004”字段分组,
展示zc2003004字段改其别名为zc2003004
展示count字段别名为allCount
展示 zc2003008 字段 sum(累加) 信息,改其别名为sum

 

posted @ 2022-09-01 11:25  凯宾斯基  阅读(100)  评论(0)    收藏  举报