MongoDB入门与实战-第四章-SpringBoot集成MongoDB

news2024/11/24 12:21:48

目录

  • 参考
  • MongoDB 连接
  • java客户端方式
    • 引入驱动依赖
    • 测试创建客户端
    • 创建集合
    • 查询文档
    • 查询集合大小
    • 条件查询
    • 排序
    • 投影
    • 聚合查询
    • 复合聚合
    • 插入文档
    • 批量插入
    • 更新文档
    • 删除文档
  • SpringDataMongoDB
    • 添加依赖
    • 配置文件
    • 新建实体映射
    • 插入文档
    • 修改文档
    • 删除

参考

SpringBoot 整合 MongoDB 实战解说

MongoDB 连接

Java 连接 MongoDB 服务器,与我们常用的连接关系型数据库方式类似!

标准 URI 连接语法:

mongodb://username:password@host1:port1,host2:port2,...,hostN:portN/database?options

参数说明:

  • mongodb://:这是固定的格式,必须要指定
  • username:password@:可选项,如果设置,在连接数据库服务器之后,驱动都会尝试登录这个数据库
  • host1:port1:主机IP和端口号,必须指定至少一个host。如果要连接复制集,请指定多个主机地址
  • /database:如果指定了username:password@,连接时会验证并登录指定数据库。若不指定,默认打开 test 数据库
  • ?options:连接可选项,例如connectTimeoutMS=5000ms,表示连接等待时间最长 5 秒

例如,无密码连接 MongoDB

mongodb://127.0.0.1:27017

使用用户名test,密码test登录 MongoDB 的test_db数据库

mongodb://test:test@127.0.0.1:27017/test_db

无密码连接指定三台服务器 (端口 27017, 27018, 和27019)

mongodb://127.0.0.1:27017,127.0.0.1:27018,127.0.0.1:27019

java客户端方式

在这里插入图片描述

引入驱动依赖

参考:https://docs.mongodb.com/drivers/java/

<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongo-java-driver</artifactId>
    <version>3.12.7</version>
</dependency>

测试创建客户端

public class MongoDBTest {
    private static final String MONGO_URL = "localhost";
    private MongoClient mongoClient = null;

    @Test
    public void testDb(){
        // 连接到数据库
        MongoDatabase mongoDatabase = mongoClient.getDatabase("test_iot");
        System.out.println("Connect to database successfully");
        mongoDatabase.createCollection("tower_crane_property");
        System.out.println("集合创建成功");
    }

    @BeforeEach
    public void initClient(){
        //连接到MongoDB服务,如果不指定库名,则需要admin的账号密码 如果是远程连接可以替换“localhost”为服务器所在IP地址
        mongoClient = MongoClients.create("mongodb://admin:123456@192.168.0.44:27017");
        // 指定库
        mongoClient = MongoClients.create("mongodb://admin:123456@192.168.0.44:27017/iot");
        // 增加库在哪里认证,在哪里创建
        mongoClient = MongoClients.create("mongodb://admin:123456@192.168.0.44:27017/iot?authSrouce=admin");
        
    }
}

创建集合

可以通过ValidationOptions增加字段校验,也可以指定集合大小
在这里插入图片描述

查询文档

/**
     * 查询文档
     */
    @Test
    public void testQuery() {
        // 连接到数据库
        MongoDatabase mongoDatabase = mongoClient.getDatabase("iot");
        System.out.println("Connect to database successfully");
        //获取集合
        MongoCollection<org.bson.Document> collection = mongoDatabase.getCollection("device");

        //遍历所有文档
        FindIterable<org.bson.Document> findIterable = collection.find();
        MongoCursor<org.bson.Document> mongoCursor = findIterable.iterator();
        while(mongoCursor.hasNext()){
            System.out.println(mongoCursor.next());
        }

        //查询当前集合所有文档数量
        long count = collection.countDocuments();
        System.out.println("当前文档数量:" + count);

        //带条件遍历文档
        FindIterable<Document> documentFindIterable = collection.find(Filters.eq("code", "manager"));
        MongoCursor<Document> documentMongoCursor = documentFindIterable.iterator();
        while(documentMongoCursor.hasNext()){
            System.out.println(documentMongoCursor.next());
        }
    }

查询集合大小

//查询当前集合所有文档数量
long count = collection.countDocuments();

条件查询

在这里插入图片描述

排序

在这里插入图片描述

投影

在这里插入图片描述

聚合查询

对stars分组并计数
在这里插入图片描述

复合聚合

excludeId不显示id,只显示firstCategory字段,这个字段是显示categories索引小标0的值,也就是categories中第一个值
在这里插入图片描述
效果
在这里插入图片描述

插入文档

/**
     * 测试插入
     */
    @Test
    public void testInsert(){
        // 连接到数据库
        MongoDatabase mongoDatabase = mongoClient.getDatabase("iot");
        //获取集合
        MongoCollection<Document> collection = mongoDatabase.getCollection("device");

        //向集合中插入文档
        Document document = new Document("name", "管理员").
                append("code", "manager").
                append("sort", 100).
                append("lat", 22.81503471517295).
                append("lng", 108.37301005337522);
        List<Document> documents = new ArrayList<>();
        documents.add(document);
        collection.insertMany(documents);
        System.out.println("文档插入成功");
    }

批量插入

在这里插入图片描述

更新文档

在这里插入图片描述

删除文档

在这里插入图片描述

SpringDataMongoDB

添加依赖


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

配置文件

server:
  port: 8083

spring:
  data:
    mongodb:
      # 服务器地址
      host: 192.168.0.44
      # 端口
      port: 27107
      # 用户名
      username: iot_admin
      # 密码
      password: iot_admin
      # 认证数据库
      authentication-database: iot
      # 操作数据库
      database: iot

新建实体映射

在这里插入图片描述

插入文档

在这里插入图片描述

修改文档

在这里插入图片描述

/**
     * 更新对象
     * @param user
     */
    @Override
    public void updateUser(UserEntity user) {
        Query query=new Query(Criteria.where("id").is(user.getId()));
        Update update= new Update().set("userName", user.getUserName()).set("passWord", user.getPassWord());
        //更新查询返回结果集的第一条
        mongoTemplate.updateFirst(query,update,UserEntity.class);
        //更新查询返回结果集的所有
        // mongoTemplate.updateMulti(query,update,UserEntity.class);
    }

删除

/**
     * 删除对象
     * @param id
     */
    @Override
    public void deleteUserById(Long id) {
        Query query=new Query(Criteria.where("id").is(id));
        mongoTemplate.remove(query,UserEntity.class);
    }
/***********方法二************/
/**
     * 删除
     *
     * @param id id
     * @return ApiResponse
     */
    public ApiResponse delete(String id) {
        try {
            Query query = new Query(Criteria.where("_id").is(id));
            DeleteResult result = mongoTemplate.remove(query, Student.class);
            long count = result.getDeletedCount();
            if (count > 0) {
                return Api.ok(count, "删除成功");
            }
            throw new ServiceException(-1, String.format("【%s】%s", id, "不存在"));
        } catch (ServiceException e) {
            throw e;
        } catch (Exception e) {
            throw new SystemException(-1, "删除出错");
        }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/4847.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]java毕业设计濒危物种科普系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

jq获取和设置偏移量:offset()、position()

jq获取和设置偏移量&#xff1a; js获取盒子的偏移量是&#xff1a;offsetLeft、offsetTop&#xff1b;jq获取盒子的偏移量的方法&#xff1a;offset&#xff08;&#xff09;、position&#xff08;&#xff09;&#xff1b;offset&#xff08;&#xff09;&#xff1a;距离文…

去除有重复的行

【问题】 I have a csv file and I have duplicate as well as unique data getting add to it on a daily basis. This involves too many duplicates. I have to remove the duplicates based on specific columns. For eg: csvfile1: title1 title2 title3 title4 title5…

C++程序开启大地址(虚拟内存),让32位程序使用4G内存的方,虚拟内存概念及寻址范围详解

如何让 32 位程序突破 2G 内存限制 一般情况下&#xff0c;32 位程序的内存大小被限制在了 2G&#xff0c;不过可以通过以下的操作来突破这个限制。 修改操作系统参数 这一步骤只针对 32 位操作系统&#xff0c;64 位操作系统可以跳过 用管理员权限打开一个命令行窗口 执行…

【数据库原理及应用】——安全性与完整性(学习笔记)

&#x1f4d6; 前言&#xff1a;随着计算机的普及&#xff0c;数据库的使用也越来越广泛。为了适应和满足数据共享的环境和要求&#xff0c;DBMS要对数据库进行保护&#xff0c;保证整个系统的正常运转&#xff0c;防止数据意外丢失、被窃取和不一致数据产生&#xff0c;以及当…

【Linux】---认识进程

文章目录进程的概念1、什么是进程2、PCB3、查看进程4、初始fork()创建进程5、kill杀死进程进程的状态普适的操作系统下的状态运行阻塞挂起Linux下的状态理解R--运行状态S--睡眠状态D--深度睡眠状态T--暂停状态t--追踪暂停状态X--死亡状态Z--僵尸状态孤儿进程进程优先级进程的其…

先广度后深度,打开编程视野

古人云 “读万卷书&#xff0c;行万里路。” 书籍是人类进步的阶梯、培养阅读习惯&#xff0c;当一个人爱上读书的时候&#xff0c;眼睛都是发光的。 在小编看来&#xff0c;学习理念是【先广度后深度】&#xff0c;先把Java知识体系的东西都了解到&#xff0c;工作上先会用&…

【数据结构与算法】之动态规划经典问题

前言 本文为 【数据结构与算法】动态规划 经典问题相关介绍 &#xff0c;具体将对最长递增子序列问题&#xff0c;找零钱问题&#xff0c;0-1背包问题相关动态规划算法问题进行详尽介绍~ &#x1f4cc;博主主页&#xff1a;小新要变强 的主页 &#x1f449;Java全栈学习路线可…

【LeetCode】No.91. Decode Ways -- Java Version

题目链接&#xff1a;https://leetcode.com/problems/decode-ways/ 1. 题目介绍&#xff08;Decode Ways&#xff09; A message containing letters from A-Z can be encoded into numbers using the following mapping: 【Translate】&#xff1a; 包含从A到z的字母的消息可…

C++之继承详解(万字讲解)

这里是目录呀前言一、继承的概念及定义1.继承的概念2.继承定义(1)定义格式(2)继承关系和访问限定符(3)继承基类成员访问方式的变化二、继承中的作用域三、基类和派生类对象赋值转换四、派生类的默认成员函数五、继承与友元六、继承与静态成员七.复杂的菱形继承及菱形虚拟继承1.…

暗猝灭剂BHQ-2 氨基,BHQ-2 amine,CAS:1241962-11-7

产品描述 1、名称 英文&#xff1a;BHQ-2 amine 中文&#xff1a;BHQ-2 氨基 2、CAS编号&#xff1a;1241962-11-7 3、所属分类&#xff1a;Other dyes 4、分子量&#xff1a;477.53 5、分子式&#xff1a;C24H27N7O4 6、质量控制&#xff1a;95% 7、储存&#xff1a; …

爱心html制作并部署github

手机也可以观看 效果预览地址 1.网页效果 心形优化 2.网页源码 源码地址 可以改变不同的图片&#xff0c;作者已经改为全局变量 <!DOCTYPE html> <html><head><title></title><script src"js/jquery-1.7.2.js"></script…

高并发,你真的理解透彻了吗?高并发核心编程手册荣登Github榜首

高并发&#xff0c;几乎是每个程序员都想拥有的经验。原因很简单&#xff1a;随着流量变大&#xff0c;会遇到各种各样的技术问题&#xff0c;比如接口响应超时、CPU load升高、GC频繁、死锁、大数据量存储等等&#xff0c;这些问题能推动我们在技术深度上不断精进。 在过往的面…

Spring Cloud Ablibaba 学习系列文章

前言&#xff1a; 最近发现Spring Cloud的应用越来越多了&#xff0c;微服务的概念在一般的互联网公司上面几乎都会使用到&#xff0c;于是准备一套Spring Cloud Alibaba的学习文章&#xff0c;文章写到一定阶段&#xff0c;会进行实战篇&#xff0c;比如搭建注册通信的框架&a…

C. Crossword Validation(字典树)

Problem - C - Codeforces 题意: 你得到了一个在NN网格上完成的填字游戏。每个单元格要么是填有字母的白色单元格&#xff0c;要么是黑色单元格。你还会得到一本包含M个不同单词的字典&#xff0c;其中每个单词都有一个与之相关的分数。网格中的一个横向候选词是在网格的同一行…

Android TCPIP常见问题

book: Understanding Linux Network Internals socket读写错误返回值&#xff1a;errno TCP: Robert Elliot Kahn IP: Robert Elliot Kahn, Vint Cerf 1 RFC规范 RFC793&#xff1a;TCP RFC768&#xff1a;UDP RFC791&#xff1a;IP RFC826&#xff1a;ARP RFC792&#xff1a;I…

请求转发与请求重定向的区别

目录 1.实现 2.具体区别 1.有关实现 请求转发与重定向分别对应forward 和 redirect两个关键字&#xff0c;接下来我们在Java中尝试去实现一下。 1.1 请求转发 我们一般使用两种方式实现&#xff0c;具体代码见下&#xff1a; RequestMapping("/fw")public Strin…

【C】语言文件操作(一)

&#x1f648;个人主页&#xff1a; 阿伟t &#x1f449;系列专栏&#xff1a;【C语言–大佬之路】 &#x1f388;今日心语&#xff1a;越忙&#xff0c;越要沉住气&#xff01; 本章重点 : 为什么使用文件什么是文件文件的打开和关闭文件的顺序读写文件的随机读写文本文件和…

Netty之I/O模型

UNIX提供的5种IO模型&#xff1a; 阻塞模型 阻塞IO模型&#xff1a; IO复用模型&#xff1a; 信号驱动IO模型&#xff1a; 对于五种IO模型我这里用自己的白话再复述一遍&#xff0c;加深理解&#xff0c;如果要看权威的解释可以自己去看《Netty权威指南》。 阻塞IO 进…

【算法】树状数组数据结构

文章目录Part.I 预备知识Chap.I 一些前提和概念Chap.II lowbit 函数Part.II 树状数组Chap.I 树状数组的思想Chap.II 树状数组的构造Part.III 树状数组的应用Chap.I LeetCode: 2426. 满足不等式的数对数目Sec.I 题目描述与分析Sec.II 代码实现Chap.II LeetCode: 51. 数组中的逆序…