MongoDB的使用MongoTemplate操作增删改查,分页,排序,聚合(含内嵌数据),文件上传下载_跳崖寻死的鸟的博客-程序员秘密_mongotemplate查询总数

技术标签: java  数据库  mongodb  nosql  

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);
        }
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45676738/article/details/106854254

智能推荐

Elasticsearch6.5.4版本集群安装设置密码_es集群设置密码会报错apm_SimpleSimpleSimples的博客-程序员秘密

1.ES安装配置文件1.1主节点配置文件# ======================== Elasticsearch Configuration =========================# ---------------------------------- Cluster -----------------------------------cluster.name: GzEsCluster# ------------------------------------ Node

MySQL Troubleshoting:Waiting on query cache mutex 腾讯数据库工程师:幕南风_weixin_30703911的博客-程序员秘密

http://blog.itpub.net/26515977/viewspace-1208188/ 今天被MySQL Query Cache 炕了、线上大量 Waiting on query cache mutex 那么什么是 Query Cache? ...

linux 各系统防火墙操作_凝思防火墙怎么关闭_墨痕诉清风的博客-程序员秘密

Centos7查看:sudo systemctl status firewalld临关:sudo systemctl stop firewalld临开:sudo systemctl start firewalld永关:sudo systemctl disable firewalld查询防火墙服务是否开机启动:systemctl is-enabled firewalld查询已经启动...

服务器证书过期时间,ssl证书过期时间监控_黄心检的博客-程序员秘密

前几天,因为网易邮箱有部分域名的ssl证书过期,导致很多苹果用户的手机遇到疯狂弹窗,提示无法验证服务器身份。在我看来,这肯定是运维的锅了。即使ssl厂商有续费提示,但是有可能因为人为的原因或者沟通的原因导致部分域名会忘记更换。所以每个https的域名都有必要添加上证书过期的提醒。(网易邮箱这次好像就是因为更换证书出现了遗漏)。如果你正在使用prometheus的作为监控工具,那么做ssl证书过期的...

3D激光SLAM点云地图pcd转导航可用的2D栅格地图_点云地图转换成二维栅格地图_Pony_PH的博客-程序员秘密

本文旨在帮助读者将激光点云地图转为2D栅格地图,以便完成路径规划与导航。本方法将pcd转为pgm的原理是将接收到的点云信息以"/map"话题的形式发布,用map_server来接收"/map"话题,保存2D栅格地图!废话不多说,直接开始!一、安装pcd2pgm#创建工作空间mkdir -p ~/pcd2pgm_ws/srccd ~/pcd2pgm/srccatkin_init_workspace#克隆代码git clone https://github.com/hujiax380/

Chrome报错:Unchecked runtime.lastError: Could not establish connection. Receiving end does not exist._野草本草的博客-程序员秘密

Chrome控制台报错:Unchecked runtime.lastError: Could not establish connection. Receiving end does not exist.解决办法:可能是扩展插件的BUG引起。尝试关闭或者移除报错的插件。

随便推点

Visual Studio 2019 详细安装和使用教程_晚风花间寺中人的博客-程序员秘密

简介此处省略很多字下载社区版本下载网址:https://visualstudio.microsoft.com/zh-hans/downloads/选择安装路径建议为VS2019新建一个专属的文件夹,用于存储安装包,安装信息等在这里你可查看 快速入门指南,重命名安装包(建议重命名为名称+版本:比如 Visual Studio 2019)安装找到刚才安装包下载路径,双击运行开始安...

使用YCSB测试MySQL、Hbase性能并比较_Sunday2017的博客-程序员秘密

YCSB在测试的时候 有固定的表结构,所以以下插入、删除都是在同等条件下测试的。Hbase结果1)、使用load进行插入数据。 1线程插入条数 总吞吐量 总运行时间(ms) 1000 356.252226576416 2807 10000 ...

战神引擎修改客户端app名字_战神引擎app改名变乱码_罗开1528的博客-程序员秘密

1.使用android反编译工具反编译(如改之理,AndroidKiller ,安桌助手,Smali2Java,APKDB 等2.找到AndroidManifest.xml文件方法一:将红色划线部分@string/app_name直接改成你想要的app名字方法二:找到 res\values\string.xml 文件 修改 app_name 就可以了.(推荐)...

用python独立制作Doip刷写ECU工具_python doip_倚天仗剑走天涯WGM的博客-程序员秘密

最近因为选择工作,选择了一个和这完全不搭的工作,一直在写ppt,没时间搞这些东西,过几天有时间我写一下如何制作!

游戏直播哪家强?虎牙、斗鱼、熊猫三强App大PK_水流心不竞的博客-程序员秘密

游戏直播哪家强?对大多数用户来说,这个答案并非绝对。但有一点是肯定的,直播内容和观看体验是用户最在意的选项。直播内容上大家各有所长,用户也有不同的钟爱口味,这一点上并不容易分高下。而直播流畅度则是一个偏技术的维度,用户感官上也比较容易分辨。  那么问题来了,当下游戏直播平台究竟哪家能够保证最流畅呢?带着这个问题我们对目前市面三家主流游戏直播平台——虎牙直播、斗鱼直播和熊猫直播进行了对比评测

centos8 nginx php7.4等环境安装配置_程序员周瑜的博客-程序员秘密

h3 { box-shadow: 0 0 1px rgba(95, 90, 75, 1), 1px 1px 6px 1px rgba(10, 10, 0, 0.5); color: rgba(255, 255, 255, 1); font-family: 微软雅黑, 宋体, 黑体, Arial; font-size: 18px; font-weight: bold; height: 25px; ...

推荐文章

热门文章

相关标签