当前位置:

首页 > 编程开发 > SpringBoot MongoDB与MongoDB GridFS怎么使用

SpringBoot MongoDB与MongoDB GridFS怎么使用

MongoDB的基本使用添加依赖org.springframework.bootspring-boot-starter-data-mongodb配置application.ymlserver:port:8888spring:application:name:dmeo-appdata:mongodb:uri:mongodb://root:123456@localhost:27017database:dmeo配置启动类@SpringBootApplication@EntityScan("cn.ybzy.mod

本文目录

    MongoDB的基本使用

    添加依赖

    	 
                org.springframework.boot
                spring-boot-starter-data-mongodb
            

    配置application.yml

    server:
      port: 8888
    spring:
      application:
        name: dmeo-app
      data:
        mongodb:
          uri:  mongodb://root:123456@localhost:27017
          database: dmeo

    配置启动类

    @SpringBootApplication
    @EntityScan("cn.ybzy.model")//扫描实体类
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application .class, args);
        }
    }

    配置日志

    配置logback-spring.xml日志,非必要配置

    
    
        
        
        
        
            
                
                %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
                utf8
            
        
        
        
            
                
                ${LOG_HOME}/xc.%d{yyyy-MM-dd}.log
            
            
                %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
            
        
        
        
            
            0
            
            512
            
            
        
        
            
        
        
        
            
            
            
        
    

    创建User文档对象

    @Data
    @ToString
    @Document(collection = "user")
    public class User {
        @Id
        private String uid;
        private String name;
        private Integer age;
        private String address;
    }

    创建UserRepository

    创建UserRepository ,继承MongoRepository,并指定实体类型和主键类型

    在MongoRepository中定义了很多现成的方法,可以更方便的使用。

    Spring Data mongodb也提供了自定义方法的规则,按照findByXXX,findByXXXAndYYY、countByXXXAndYYY等规则定义方法,实现查询操作。

    /**
     * @Author: CJ
     * @Description:
     **/
    public interface UserRepository extends MongoRepository {
        /**
         * 根据页面名称查询
         * @param name
         * @return
         */
        User findByName(String name);
        /**
         * 根据页面名称和类型查询
         * @param name
         * @param age
         * @return
         */
        User findByNameAndAge(String name,Integer age);
        /**
         * 根据站点和页面类型查询记录数
         * @param name
         * @param age
         * @return
         */
        int countByNameAndAge(String name,Integer age);
        /**
         * 根据站点和页面类型分页查询
         * @param name
         * @param address
         * @param pageable
         * @return
         */
        Page findByNameAndAddress(String name, String address, Pageable pageable);
    }

    执行测试

    @SpringBootTest
    @RunWith(SpringRunner.class)
    public class UserRepositoryTest {
        @Autowired
        private UserRepository userRepository;
        @Test
        public void testFindAll() {
            //从0开始
            int page = 0;
            int size = 10;
            Pageable pageable = PageRequest.of(page, size);
            Page all = userRepository.findAll(pageable);
            System.out.println(all);
        }
        @Test
        public void testSave() {
            User user = new User();
            user.setName("lisi");
            user.setAddress("China");
            user.setAge(12);
            userRepository.save(user);
            System.out.println(user);
        }
        @Test
        public void testDelete() {
            userRepository.deleteById("5fce3a0728df2033145874fc");
        }
        @Test
        public void testUpdate() {
        	 /**
             * Optional是jdk1.8引入的类型,Optional是一个容器对象
             * 它包括了需要的对象,使用isPresent方法判断所包含对象是否为空
             * isPresent方法返回false则表示Optional包含对象为空,否则可以使用get()取出对象进行操作。
             * Optional的优点是:
             *      1、提醒非空判断。
             *      2、将对象非空检测标准化。
             */
            Optional optional = userRepository.findById("5fce3a0728df2033145874fc");
            if (optional.isPresent()) {
                User user = optional.get();
                user.setAge(22);
                userRepository.save(user);
            }
        }
        @Test
        public void testFindByName() {
            User user = userRepository.findByName("lisi");
            System.out.println(user);
        }
        @Test
        public void testCountByNameAndAge() {
            int count = userRepository.countByNameAndAge("lisi", 12);
            System.out.println(count);
        }
    	//自定义条件查询
    	@Test
        public void testExample() {
            //条件值
            User user= new User ();
            user.setAge(22);
            user.setAddress("China");
            //条件匹配器
            ExampleMatcher exampleMatcher = ExampleMatcher.matching();
            //ExampleMatcher.GenericPropertyMatchers.contains() 包含关键字,即模糊查询
            exampleMatcher = exampleMatcher.withMatcher("address",
                    ExampleMatcher.GenericPropertyMatchers.contains());
            //创建条件实例
            Example example = Example.of(user, exampleMatcher);
            //分页对象
            Pageable pageable = new PageRequest(0, 10);
            //分页查询
            Page UserList = cmsPageRepository.findAll(example, pageable);
            System.out.println(UserList);
        }
    }

    GridFS的基本使用

    GridFS概述

    GridFS是MongoDB提供的用于持久化存储文件的模块。

    工作原理:

    GridFS存储文件是将文件分块存储,文件会按照256KB的大小分割成多个块进行存储,GridFS使用两个集合(collection)存储文件,一个集合是chunks, 用于存储文件的二进制数据;一个集合是files,用于存储文件的元数据信息(文件名称、块大小、上传时间等信息)。

    特点:

    用于存储和恢复超过16M(BSON文件限制)的文件(如:图片、音频、视频等)

    是文件存储的一种方式,但它是存储在MonoDB的集合中

    可以更好的存储大于16M的文件

    会将大文件对象分割成多个小的chunk(文件片段),一般为256k/个,每个chunk将作为MongoDB的一个文档(document)被存储在chunks集合中

    用两个集合来存储一个文件:fs.files与fs.chunks

    每个文件的实际内容被存在chunks(二进制数据)中,和文件有关的meta数据(filename,content_type,还有用户自定义的属性)将会被存在files集合中。

    详细参考:官网文档

    存放文件

    SpringBoot MongoDB与MongoDB GridFS怎么使用

    	@Autowired
        GridFsTemplate gridFsTemplate;
        @Test
        public void testSaveFile() throws FileNotFoundException {
            //要存储的文件
            File file = new File("C:\\Users\\JackChen\\Desktop\\360截图18141222225269.png");
            //定义输入流
            FileInputStream inputStram = new FileInputStream(file);
            //向GridFS存储文件
            ObjectId objectId =  gridFsTemplate.store(inputStram, "1.png", "");
            //得到文件ID
            String fileId = objectId.toString();
            //5fd46f5c3629763ad83f9b86
            System.out.println(fileId);
        }

    文件存储成功得到一个文件id,该文件id是fs.files集合中的主键

    SpringBoot MongoDB与MongoDB GridFS怎么使用

    可以通过文件id查询fs.chunks表中的记录,得到文件的内容。

    当GridFS中读取文件时,若文件分成多块,需要对文件的各分块进行组装、合并

    SpringBoot MongoDB与MongoDB GridFS怎么使用

    读取文件

    定义一个Mongodb的配置类,初始化项目时创建一个GridFSBucket对象,用于打开下载流对象。

    @Configuration
    public class MongoConfig {
        @Value("${spring.data.mongodb.database}")
        String db;
        @Bean
        public GridFSBucket getGridFSBucket(MongoClient mongoClient){
            MongoDatabase database = mongoClient.getDatabase(db);
            GridFSBucket bucket = GridFSBuckets.create(database);
            return bucket;
        }
    }
        @Test
        public void testReadFile() throws IOException {
            //根据文件id查询文件
            GridFSFile gridFSFile = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is("5fd46f5c3629763ad83f9b86")));
            //打开一个下载流对象
            GridFSDownloadStream gridFSDownloadStream = gridFSBucket.openDownloadStream(gridFSFile.getObjectId());
            //创建GridFsResource对象,获取流
            GridFsResource gridFsResource = new GridFsResource(gridFSFile,gridFSDownloadStream);
            File file = new File("C:\\Users\\JackChen\\Desktop\\2.png");
            FileOutputStream fileOutputStream = new FileOutputStream(file);
            IOUtils.copy(gridFsResource.getInputStream(),fileOutputStream);
            fileOutputStream.close();
        }

    SpringBoot MongoDB与MongoDB GridFS怎么使用

    删除文件

    	@Autowired
        GridFsTemplate gridFsTemplate;
        @Test
        public void testDelFile() throws IOException {
            //根据文件id删除fs.files和fs.chunks中的记录
            gridFsTemplate.delete(Query.query(Criteria.where("_id").is("5fd46f5c3629763ad83f9b86")));
        }

    SpringBoot MongoDB与MongoDB GridFS怎么使用

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 MongoDB
    相关文章 更多
    mongodb删除数据库命令及操作方法教程
    mongodb删除数据库命令及操作方法教程

    学习如何使用MongoDB的dropDatabase命令安全删除数据库。本文提供命令行和图形化界面的详细操作步骤,帮助开发者正确清理无用数据并释放存储空间。

    启动mongodb服务命令是什么及正确执行方法
    启动mongodb服务命令是什么及正确执行方法

    深入解析启动MongoDB服务的多种命令形式,涵盖Linux系统服务、手动命令行启动、Windows服务管理及Docker容器化部署,重点说明配置文件路径、数据目录权限及前后台运行模式的区别,为开发者提供准确的运维操作指南。

    Go 中 MongoDB 结构体字段为空的原因及正确序列化方法
    Go 中 MongoDB 结构体字段为空的原因及正确序列化方法

    在Go操作MongoDB时,结构体字段反序列化为空,原因通常是字段首字母小写未导出,BSON解析器无法访问。正确做法是将字段名首字母大写,并通过bson标签精确映射数据库字段。对于_id字段,建议使用primitive.ObjectID或bson.ObjectId类型以保持类型语义。

    如何在 Go 中使用 mgo 驱动对 MongoDB 数组字段进行精确投影查询
    如何在 Go 中使用 mgo 驱动对 MongoDB 数组字段进行精确投影查询

    在Go语言的mgo驱动中,正确使用Select()方法配合$elemMatch投影操作符,可从MongoDB数组字段中精准提取单个匹配元素,避免返回整个数组,从而大幅提升查询性能。请务必注意,$elemMatch必须放在Select()的投影参数中,而绝不能放在Find()的查询条件中。

    如何在 Go 中将多个 bson.M 操作合并为单个 MongoDB 更新文档
    如何在 Go 中将多个 bson.M 操作合并为单个 MongoDB 更新文档

    在Go的mongo-go-driver中,将多个同类型MongoDB更新操作(如$inc、$set)合并到单个bson.M时,需按操作符归拢字段值避免键冲突。通过工具方法AddToBsonMapElement动态构建扁平化嵌套结构,支持$inc、$set、$unset等操作符,并自动处理子映射。最终生成类似{"$inc":{"a":1,"b":2}}的格式,

    如何正确解析 MongoDB 中嵌套的 bson.M 数据并安全访问字段
    如何正确解析 MongoDB 中嵌套的 bson.M 数据并安全访问字段

    在 Go 里折腾 MongoDB,尤其用的还是 gopkg.in/mgo.v2 这个驱动时,嵌套文档的处理往往是最容易踩坑的地方。很多人习惯一股脑用 []bson.M 把查询结果接下来,然后再一层层做类型断言——结果呢?运行时一个 interface conversion: interface {}

    Go 中 MongoDB 结构体字段序列化为空的解决方案
    Go 中 MongoDB 结构体字段序列化为空的解决方案

    Go 中 MongoDB 结构体字段序列化为空的解决方案 在 Go 中使用 mgo(或官方驱动)操作 MongoDB 时,若结构体字段为小写(未导出),BSON 解析器无法访问并赋值,导致反序列化后所有字段为空;必须将字段首字母大写以确保其可导出。 不少刚接触 Go 和 MongoDB 开发的朋友,

    PHP删除MongoDB数据的完整教程
    PHP删除MongoDB数据的完整教程

    删除MongoDB中的数据在PHP开发中的核心步骤包括:1.建立MongoDB连接,使用MongoDB\Driver\Manager类连接数据库;2.构造删除条件,通过filter指定要删除的文档;3.执行删除操作,利用BulkWrite类执行delete方法并获取结果;4.可选设置删除选项,如限制删除一条记录以避免误删。整个过程需谨慎验证条件,确保参数正确,防止误删重要数据。

    PHP如何使用MongoDB实现数据的转换和格式化
    PHP如何使用MongoDB实现数据的转换和格式化

    PHP如何使用MongoDB实现数据的转换和格式化摘要:本文将介绍如何使用PHP和MongoDB来处理数据的转换和格式化。在开发Web应用时,数据的转换和格式化是一个非常常见的需求。MongoDB是一种非关系型数据库,提供了灵活的文档存储方式,可以方便地存储和操作数据。PHP是一种广泛应用在服务器端的脚本语言,与MongoDB的结合使用可以实现高效的数据转换

    如何使用PHP在MongoDB中实现反向索引
    如何使用PHP在MongoDB中实现反向索引

    如何使用PHP在MongoDB中实现反向索引引言:在MongoDB数据库中,数据存储以文档的形式进行,每个文档都有一个唯一的_id,通过_id可以快速定位到对应的文档。然而,在某些场景下我们可能需要根据其他字段进行快速的索引和查询。本文将介绍如何使用PHP在MongoDB中实现反向索引。什么是反向索引?反向索引是指在数据库中创建一个倒排索引,通过将存储数据的

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。