MongoDB的使用MongoTemplate操作增删改查,分页,排序,聚合(含内嵌数据),文件上传下载

MongoDB简单介绍

MongoDB是一个开源、高性能、无模式的文档型数据库,当初的设计就是用于简化开发和方便扩展,是NoSQL数据库产品中的一种。是最像关系型数据库(MySQL)的非关系型数据库。
它支持的数据结构非常松散,是一种类似于 JSON 的 格式叫BSON,所以它既可以存储比较复杂的数据类型,又相当的灵活。

依赖包

       <!--springboot是2.1.6.RELEASE-->

         <!--操作MongoDB核心包-->
         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
        <!--简化实体类和日志的操作-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.10</version>
        </dependency>

yml简单配置

spring:
  data:
    mongodb:
      host: 192.168.142.139
      database: articledb#数据库名
      port: 27017
      #也可以使用uri连接
     #uri: mongodb://192.168.142.139:27017/articledb

实体类

@Data//相当于get/set方法
@Document(collection="comment")//对应数据库的集合名(表名)
//复合索引
//@CompoundIndex( def = "{'userid': 1, 'nickname': -1}")
public class Comment implements Serializable {
    //主键标识,该属性的值会自动对应mongodb的主键字段"_id",如果该属性名就叫“id”,则该注解可以省略,否则必须写
    @Id
    private String id;//主键
    //该属性对应mongodb的字段的名字,如果一致,则无需该注解
    @Field("content")
    private String content;//吐槽内容
    private Date publishtime;//发布日期
    //添加了一个单字段的索引一般在数据库中加
    @Indexed
    private String userid;//发布人ID
    private String nickname;//昵称
    private LocalDateTime createdatetime;//评论的日期时间
    private Integer likenum;//点赞数
    private Integer replynum;//回复数
    private String state;//状态
    private String parentid;//上级ID
    private String articleid;
    private List<User> users;//自己建立的一个实体类User测试内嵌数据
}

非内嵌形式

增(insert)

    @Autowired
    private MongoTemplate mongoTemplate;
    @Override
    public Comment insert(Comment comment) {
        log.info("简单的新增开始");
        Comment insert = mongoTemplate.insert(comment);
        return insert;
    }

添加多条记录
mongoTemplate.insert(数据结合,Comment.class);

删(remove)

根据实体类对象删除测试只有设定id才可以

   @Override
    public Long removeObj() {
        log.info("removeObj()");
        Comment comment = new Comment();
        comment.setId("1");
        DeleteResult remove = mongoTemplate.remove(comment);
        long deletedCount = remove.getDeletedCount();
        return deletedCount;
    }

根据条件删除(Query对象)推荐使用这个

    @Override
    public Long removeQuery() {
        log.info("removeQuery");
        Query query = new Query();
        //把userid==100的删除
        Criteria criteria = Criteria.where("userid").is("100");
        query.addCriteria(criteria);
        DeleteResult remove = mongoTemplate.remove(query, Comment.class);
        return remove.getDeletedCount();
    }

改(updateFirst|updateMulti)

mongoTemplate.updateFirst(query, update, Comment.class);更新匹配的第一条数据

 @Override
    public Long updateFirstComment() {
        log.info("updateFirstComment");
        Query query = Query.query(Criteria.where("userid").is("1003"));
        Update update = new Update();
        update.set("nickname", "updateFirstComment");
        UpdateResult updateResult = mongoTemplate.updateFirst(query, update, Comment.class);
        System.out.println(updateResult.getMatchedCount());
        return updateResult.getMatchedCount();
    }

UpdateResult updateMulti(Query query, Update update, Class<?> entityClass);更新匹配条件的全部数据

 @Override
    public Long updateMultiComment() {
        log.info("updateMultiComment");
        Query query = Query.query(Criteria.where("userid").is("1003"));
        Update update = new Update();
        update.set("nickname", "updateMultiComment");
        UpdateResult updateResult = mongoTemplate.updateMulti(query, update, Comment.class);
        System.out.println(updateResult.getMatchedCount());
        return updateResult.getMatchedCount();
    }

UpdateResult upsert(Query var1, Update var2, Class<?> var3);如果数据不存在就增加一条

查全部结果(findAll)
 @Override
    public List<Comment> findAll() {
        //Comment.class实体类的class对象
        log.info("findAll");
        List<Comment> all = mongoTemplate.findAll(Comment.class);
        return all;
    }
条件查询–或(or)
    @Override
    public List<Comment> findQueryComment() {
        //条件一
        Criteria criteria1 = new Criteria();
        criteria1.and("users.id").is("001");
        //条件二
        Criteria criteria2 = new Criteria();
        criteria2.and("userid").is("1003");
        //把条件或起来
        Criteria criteria = new Criteria();
        criteria.orOperator(criteria1,criteria2);
        Query query = new Query();
        query.addCriteria(criteria);
        List<Comment> comments = mongoTemplate.find(query, Comment.class);
        return comments;
    }
条件查询–且(and)
    @Override
    public List<Comment> findQueryComment() {

        Criteria criteria = new Criteria();
        //且比或简单
        criteria.and("users.id").is("1").and("userid").is("100");
        Query query = new Query();
        query.addCriteria(criteria);
        List<Comment> comments = mongoTemplate.find(query, Comment.class);
        return comments;
    }
条件查询-模糊查询(regex)
    @Override
    public List<Comment> findQueryComment() {

        Query query = new Query();
        Criteria criteria = new Criteria();
        //正则
        criteria.and("userid").regex("^.*"+0+".*$");
        query.addCriteria(criteria);
        List<Comment> comments = mongoTemplate.find(query, Comment.class);
        
        return comments;
    }
条件查询-查总数(count )
@Override
    public Long findQueryComment() {

        Query query = new Query();
        Criteria criteria = new Criteria();
        //正则
        criteria.and("userid").regex("^.*"+0+".*$");
        query.addCriteria(criteria);
        long count = mongoTemplate.count(query, Comment.class);

        return count;
    }
条件查询-排序(sort)
   @Override
    public List<Comment> findQueryComment() {
       //条件
        Query query = Query.query(Criteria.where("userid").is("1003"));
        //排序规则 把id倒序
        Sort sort = new Sort(Sort.Direction.DESC,"_id");
        query.with(sort);
        List<Comment> comments = mongoTemplate.find(query, Comment.class);
        return comments;
    }
条件查询-分页(Pageable)
 @Override
    public List<Comment> findQueryComment() {
       //条件体
        Query query = new Query();
        //排序规则 把id倒序
        Sort sort = new Sort(Sort.Direction.DESC,"_id");
        //当前页+页的大小(当前页应该是实际页数减一)
        PageRequest page = PageRequest.of(0, 2);
        query.with(sort);
        //分页 ===也可以用query.skip(当前页-1).limit(页的大小)
        query.with(page);
        List<Comment> comments = mongoTemplate.find(query, Comment.class);
        return comments;
    }

聚合查询(Aggregation )

        Criteria criteria = new Criteria();
    
        criteria.and("users.id").is("1").and("userid").is("100");
        //Aggregation.group("userid").count().as("total")
        //count 聚合函数(和SQL一样)
        Aggregation aggregation = Aggregation.newAggregation(Aggregation.match(criteria),
                Aggregation.group("userid").count().as("total"),
                Aggregation.sort(Sort.Direction.DESC, "total"));
    //comment表名 JSONObject.class返回的类型,可以自行封装实体类属性名要和聚合的别名一样才可以注入,类似mybatis
        AggregationResults<JSONObject> aggregate = mongoTemplate.aggregate(aggregation,
                "comment", JSONObject.class);
     List<JSONObject> Comments =  aggregate.getMappedResults();

内嵌增加数据

如果想在users的集合里加一条数据怎么办?

{
    "_id":"5eec4eaeefe450068c1dc854",
    "content":"我是简单的增加",
    "userid":"100",
    "createdatetime":"2020-06-19T05:35:42.389Z",
    "likenum":10,
    "parentid":"1003",
    "articleid":"100",
    "users":[
        {
            "_id":"1",
            "name":"小明"
        }
    ],
    "_class":"com.hlxy.mongodb.pojo.Comment"
}

增(update.push(字段,值);)

    @Autowired
    private MongoTemplate mongoTemplate;
    @Override
    public Long pushUser() {
        Query q = Query.query(Criteria.where("_id").is("1"));
        User user = new User();
        user.setId("003");
        user.setName("小米");
        Update update = new Update();
        //users是字段名 把user添加到users的集合中内嵌的数据
        update.push("users",user);
        UpdateResult updateResult = mongoTemplate.updateFirst(q, update, Comment.class);
        return updateResult.getMatchedCount();
    }

删(update.pull(“字段”,对象);)

    @Override
    public Long pullUser() {
        Query q = Query.query(Criteria.where("_id").is("1"));
        User user = new User();
        user.setId("003");
        Update update = new Update();
        //users是字段名 users中查找匹配的user删除
        update.pull("users",user);
        UpdateResult updateResult = mongoTemplate.updateFirst(q, update, Comment.class);
        return updateResult.getMatchedCount();
    }

update.pullAll(“字段”,集合)

改(update.set)

update.set(“users.$.name”,“值”);//修改users.name为例子
在条件上一般加上"users.name"作为筛选条件

 @Override
    public Long updateComment() {
      
        Query query =  Query.query(Criteria.where("_id").is("5eec3048efe4502f201b7ea8"));
        //修改条件-明确到修改users数组中的哪些数据,,没写则在全users数组中匹配
        query.addCriteria(Criteria.where("users.name").is("小明")))
        Update update = new Update();
        update.set("users.$.name","数据改了");
        UpdateResult updateResult = mongoTemplate.updateFirst(query, update, Comment.class);
        return updateResult.getMatchedCount();
    }

如果是修改多条数据把$ 改成 $ []
update.set(“users.$[].name”,“数据全部改了”);

查(find)

查询基本不变字段名:users.id

  @Override
    public List<Comment> find() {
        Query query = Query.query(Criteria.where("users.id").is("003"));
        List<Comment> comments = mongoTemplate.find(query, Comment.class);
        return comments;
    }

查询返回指定字段

query.fields().include(“字段”); //包含该字段
query.fields().exclude(“字段”);//不包含该字段

    @Override
    public List<Comment> find() {
        Query query = Query.query(Criteria.where("users.id").is("003"));
        query.fields().exclude("users");
        List<Comment> comments = mongoTemplate.find(query, Comment.class);
        return comments;
    }

文件上传

//  @Autowired
//   private GridFsTemplate gridFsTemplate;---和mongoTemplate一样注入就好
 ObjectId store = gridFsTemplate.store(file.getInputStream(), file.getOriginalFilename(), file.getContentType());
String fileId = store.toHexString();//文件id-下载要用-要保存起来

文件下载

  String id = fileId;//fileId是上传时返回的文件id
  //根据文件id获取下载信息
 GridFSFile file = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(id)));
        if(file!=null){
             //获取文件
            GridFsResource gridFsResource = new GridFsResource(file, GridFSBuckets.create(mongoTemplate.getDb()).openDownloadStream(file.getObjectId()));
          //文件名称
            String fileName = URLEncoder.encode(gridFsResource.getFilename(), "UTF-8");
            //设置下载属性
            response.setContentType(gridFsResource.getContentType());
            response.setCharacterEncoding("utf-8");
            response.setHeader("Content-disposition", "attachment;filename=" + fileName);
            ServletOutputStream outputStream = response.getOutputStream();
            //把获取到的文件流输入到 response的输出流(下载)
            IOUtils.copy(gridFsResource.getInputStream(),outputStream);
        }
  • 13
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
MongoTemplate是Spring Data MongoDB提供的一个MongoDB操作模板,它封装了对MongoDB的常用操作方法。以下是MongoTemplate增删改查语法示例: 1. 插入文档(增加数据): 使用`insert()`方法插入单个文档: ```java mongoTemplate.insert(objectToInsert, collectionName); ``` 使用`insertAll()`方法插入多个文档: ```java mongoTemplate.insertAll(listOfObjectsToInsert); ``` 2. 查询文档(查询数据): 使用`find()`方法查询文档: ```java mongoTemplate.find(query, Object.class, collectionName); ``` 查询所有文档: ```java mongoTemplate.findAll(Object.class, collectionName); ``` 3. 更新文档(修改数据): 使用`updateFirst()`方法更新单个文档: ```java mongoTemplate.updateFirst(query, update, Object.class, collectionName); ``` 使用`updateMulti()`方法更新多个文档: ```java mongoTemplate.updateMulti(query, update, Object.class, collectionName); ``` 4. 删除文档(删除数据): 使用`remove()`方法删除单个文档: ```java mongoTemplate.remove(query, Object.class, collectionName); ``` 使用`removeMulti()`方法删除多个文档: ```java mongoTemplate.remove(query, Object.class, collectionName); ``` 其中,`mongoTemplate`是你创建的MongoTemplate对象,`query`是查询条件,`update`是更新操作的内容,`Object.class`表示要查询或更新的文档类型,`collectionName`是集合名称。你可以根据自己的需求使用不同的查询条件和更新操作来完成相应的操作。具体的语法和选项可以参考Spring Data MongoDB的官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值