16、MongonDB数据库的基本使用

news2024/11/15 23:19:57

1、MongonDB简介

什么是MongoDB一个以JSON为数据模型的文档非关系型数据库
什么是非关系型数据库NoSQL,—种区分关系型数据库的数据存储方案,具有易扩展,大数据量,高性能,灵活数据模型,高可用等特点
为什么叫文档数据库文档来自与"JSON Document",并不是我们理解的PDF,WORD文档
MonogDB它爹是谁美国上市公司MongoDB Inc.
有哪些用途应用数据库,类似于Oracle,Mysql,专注于海量数据处理,数据平台
有哪些特点1:建模灵活,2: json数据模型,3:横向扩展简单 4:大数据量存储,5:高并发
是开源的吗社区版:居于SSPL协议,开源的,企业版:居于商业协议,需付费使用

2、MongonDB与RDBMS数据库的区别

MongonDBRDBMS
数据模型文档类型(json)关系模型(二维表)
数据库类型OLTPOLTP
CRUD操作MQL/sQLsQ
高可用复制集集群模式
横向扩展能力通过原生分片完善支持数据分区或者应用侵入式
索引支持B-树、全文索引、地理位置索引、多键所以、TTL索引B树
开发难度容易困难
数据容量没有理论的上限千万、亿
扩展方式垂直扩展+水平扩展垂直扩展+水平扩展

3、MongonDB优势

  • 简单直观
  • 结构灵活
    在这里插入图片描述
  • 快速开发
    在这里插入图片描述
  • 高可用与易拓展
    在这里插入图片描述

4、MongonDB应用场景

  • 游戏场景,使用 MongoDB 存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、更新
  • 物流场景,使用 MongoDB 存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB 内嵌数组的形式来存储,一次查询,就能将订单所有的变更读取出来。
  • 社交场景,使用 MongoDB 存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能
  • 物联网场景,使用 MongoDB 存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析
  • 视频直播,使用 MongoDB 存储用户信息、礼物信息等
  • 日志处理

5、MongonDB安装

  • mongon安装参考文章

6、基本概念

在这里插入图片描述在这里插入图片描述

7、数据类型

在这里插入图片描述

8、MongonDB增删改查

//语法:
//db.集合名.insert( 文档 ) : 往集合中插入一个文档或者多个
//注意:
//1:往集合中新增文档,当集合不存在时会自动先创建集合
//2:当操作成功时,集合会给文档生成一个**_id**字段,也可以自己指定

db.users.insert({
    id: 1,
    name: "dafei",
    age: 18
})

db.users.insert({
    id: 2,
    name: "xiaofei",
    age: 17
})

格式: 
//update users set xx=1 where xx = 1
//db.集合名.updateOne(<query>, <update>)
//db.集合名.updateMany(<query>,<update>)
//query : update的查询条件,类似sql update查询内where后面的。
//update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
//把一个带有name=dafei的文档,修改其age值为30

db.users.updateOne({
    name: "dafei"
}, {
    $set: {
        age: 30
    }
})

//修改所有name=dafei的文档,修改其name=大飞,age=20
db.users.updateMany({
    name: "dafei"
}{
    $set: {
        name: "大飞",
        age: 20
    }
})


//修改所有的文档,修改其name=xxx,age=10
db.users.updateMany({}{
    $set: {
        name: "xxx",
        age: 10
    }
})


//删除1个:
//db.集合名.deleteOne(<query>)
//删除多个:
//db.集合名.deleteMany(<query>)
//删除_id=xxx的文档
db.users.deleteOne({
    _id: ObjectId("xxx")
})

//删除所有带有name=dafei的文档
db.users.deleteMany({
    name: "bunny"
})

//删除当前数据库中所有文档
db.users.deleteMany({})


语法:
//sql: select age, name  from table where ....
//db.集合名.find(query, projection)
//query: 是条件
//projection: 列的投影,指定返回哪些列 _id默认返回 eg: {"_id": 0}
//查所有用户
//sql: select * from users;
db.users.find()
db.users.find({}) //{} 是条件
db.users.find({}, {
    name: 1,
    age: 1
}) //第二个{} 表示查询哪些列

//db.集合名.find(query, projection).
sort({
    列:1
}) //正序
sort({
    列: - 1
}) //倒序
//多列排序
sort({1: 1, 列2: 1
})
//查询所有用户按年龄排序
//sql: select * from users order by age desc|asc
db.users.find({}).sort({
    age: 1
}) //正序
db.users.find({}).sort({
    age: - 1
}) //倒序
db.users.find({}).sort({
    age: - 1,
    id: 1
}) //多列排序
//db.集合.find({}).skip(n).limit(m)
//分页查询所有用户

//sql: select * from users limit 0, 3   
db.users.find().skip(0).limit(3) //第一页
db.users.find().skip(3).limit(3) //第二页
db.users.find().skip((currentPage - 1) * pageSize).limit(pageSize)
//语法 ->db.集合名. find({字段: {比较操作符: 值, ...}})
//> 大于 - $gt
//< 小于 - $lt
//>= 大于等于 - $gte
//<=  小于等于 - $lte
//!= 不等 - $ne
//is null    {$exists: false}
//in   {$in: [xx, xx ...]}
//查询age > 30的用户
//sql: select * from users where age > 300
db.users.find({
    age: {
        $gt: 30
    }
})

//查询名字为 dafei 或xiaofei用户
//sql: select * form users where name in("dafei", "xiaofei")
db.users.find({
    name: {
        $in: ["dafei", "xiaofei"]
    }
})

//判断判断指定列是否存在
db.users.find({
    name: {
        $exists: true
    }
})

语法 -> find({
    逻辑操作符: [条件1, 条件2...]
})

&&- $and
 ||- $or
!- $not
查年龄在2830间的用户信息
//sql:  select * from users where age >= 28 and age <=30
db.users.find( 
    {
        age: {
            $gte: 28,
            $lte: 30
        }
    }
)

db.users.find(  
    {
        $and: [{
            age: {
                $gte: 28
            }
        }, {
            age: {
                $lte: 30
            }
        }]
    }
)

// 查看年龄小于28或者年龄大于30用户信息
//sql: select * from users where age <28 or age >30

db.users.find(
    {
        $or: [{
            age: {
                $lt: 28
            }
        }, {
            age: {
                $gt: 30
            }
        }]
    }
)

查看年龄等于28或者等于30用户信息
//sql: select * from users where age =28 or age =30
db.users.find(
    {
        $or: [{
            age: 28
        }, {
            age: 30
        }]
    }
)

db.集合.find({
    : {
        $regex: /关键字/
    }
})
//sql: select * from user where name like '%关键字%'
db.集合.find({
    : {
        $regex: /关键字/
    }
}) / / 表示正则对象(js)
db.集合.find({
    : {
        $regex: "关键字"
    }
})
 {
    name: /xxx/
} --->% xxx % 
{
    name: /^xxx/
} ---> xxx % 
{
    name: /xxx$/
} --->% xxx
{
    name: /xxx/i
} 忽略大小写
查询name带有fei的用户信息
//sql: select * from users where name like '%fei%'
db.users.find( 
    {
        name: {
            $regex: /fei/
        }
    }
)
查name中包含fei字样,并且年龄在2830间的用户信息, //sql:  select * from users where name like '%fei%' and age >= 28 and age <=30
db.users.find(
{
    $and: [{
        name: {
            $regex: /fei/
        }
    }, {
        age: {
            $gte: 28,
            $lte: 30
        }
    }]
})

9、SpringBoot集成MongonDB

  • 创建maven项目
  • 添加相关依赖
 <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.3</version>
        <relativePath/>
  </parent>

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

    <dependency>
        <groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>    
    
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>

    <!--spring boot data mongodb-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>
</dependencies>
  • 配置文件
# application.properties
# 配置数据库连接
#格式: mongodb://账号:密码@ip:端口/数据库?认证数据库
#spring.data.mongodb.uri=mongodb://root:admin@localhost/mongodemo?authSource=admin
spring.data.mongodb.uri=mongodb://localhost/mongodemo
# 配置MongoTemplate的执行日志
logging.level.org.springframework.data.mongodb.core=debug
  • 创建实体类
@AllArgsConstructor
@NoArgsConstructor
@Setter
@Getter
@ToString
@Document("users") //设置文档所在的集合
public class User {
    //文档的id使用ObjectId类型来封装,并且贴上@Id注解,
    // 自动映射为_id 自动封装ObjectId
    @Id
    private String id;
    private String name;
    private Integer age;
    private List<String> hobby = new ArrayList<>();
}
  • crud操作及测试
// 持久层接口——继承接口:MongoRepository
@Repository
public interface UserMongoRepository extends MongoRepository<User, String> {
    // 使用Spring Data命名规范做高级查询
    List<User> findByName(String name);
}

// 业务层接口
public interface IUserService {
    void save(User user);
    void delete(String id);
    void update(User user);
    User get(String id);
    List<User> list();
}

// 业务层实现类
@Service
public class UserServiceImpl  implements IUserService{

    @Autowired
    private UserRepository userRepository;

    @Override
    public void save(User user) {
        userRepository.save(user);
    }

    @Override
    public void delete(String id) {
        userRepository.deleteById(id);
    }

    @Override
    public void update(User user) {
        userRepository.save(user);
    }

    @Override
    public User get(String id) {
        return userRepository.findById(id).get();
    }

    @Override
    public List<User> list() {
        return userRepository.findAll();
    }
}


// 测试类
@SpringBootTest
public class UserTest {

    @Autowired
    private IUserService userService;

    @Test
    public void testSave(){
        User user = new User();
        user.setId(21L);
        user.setName("dafei");
        user.setAge(18);
        userService.save(user);
    }

    @Test
    public void testUpdate(){
        User user = new User();
        user.setId("5de507fca0852c6c7ebc1eac");
        user.setId(21L);
        user.setName("dafei2222");
        user.setAge(18);
        userService.update(user);
    }

    @Test
    public void testDelete(){
        userService.delete("5de507fca0852c6c7ebc1eac");
    }

    @Test
    public void testGet(){
        System.out.println(userService.get("5de507fca0852c6c7ebc1eac"));
    }

    @Test
    public void testList(){
        System.out.println(userService.list());
    }
}
  • JPA 查询规则
    在这里插入图片描述

  • 分页查询

 @Autowired
    private MongoTemplate mongoTemplate;
    // 分页查询文档,显示第2页,每页显示3个,按照id升序排列

    @Test
    public void testQuery1() throws Exception {
        // 创建查询对象
        Query query = new Query();
        // 设置分页信息
        query.skip(3).limit(3);
        // 设置排序规则
        query.with(Sort.by(Sort.Direction.ASC,"id"));
        List<User> list = mongoTemplate.find(query, User.class, "users");
        list.forEach(System.err::println);
    }
  • 条件查询
@SpringBootTest
public class QueryTest {

    @Autowired
    private MongoTemplate mongoTemplate;

    // 分页查询文档,显示第2页,每页显示3个,按照id升序排列
    @Test
    public void testQuery1() throws Exception {
        // 创建查询对象
        Query query = new Query();
        // 设置分页信息
        query.skip(3).limit(3);
        // 设置排序规则
        query.with(Sort.by(Sort.Direction.ASC,"id"));
        List<User> list = mongoTemplate.find(query, User.class, "users");
        list.forEach(System.err::println);
    }

    // 查询所有name为dafei的文档
    @Test
    public void testQuery2() throws Exception {
        // 构建限制条件 {"name": "dafei"}
        Criteria criteria = Criteria.where("name").is("dafei");
        // 创建查询对象
        Query query = new Query();
        // 添加限制条件
        query.addCriteria(criteria);
        List<User> list = mongoTemplate.find(query, User.class, "users");
        list.forEach(System.err::println);
    }

    // 查询所有name为dafei或者age<30的文档
    @Test
    public void testQuery3() throws Exception {
        // 构建限制条件 { "$or": [{"name": "dafei"}, {"age": {"$lt": 30}}] }
        Criteria criteria = new Criteria().orOperator(
                Criteria.where("name").is("dafei"),
                Criteria.where("age").lt(30)
        );

        // 创建查询对象
        Query query = new Query();
        // 添加限制条件
        query.addCriteria(criteria);
        List<User> list = mongoTemplate.find(query, User.class, "users");
        list.forEach(System.err::println);
    }

    // 查询所有name含有fei并且30<=age<=32的文档
    @Test
    public void testQuery4() throws Exception {
        // 构建限制条件 { "$and" : [{"name": {"$regex": ".*fei.*"} }, {"age": {"$gte": 30, "$lte": 32 } }] }
        Criteria criteria = new Criteria().andOperator(
                Criteria.where("name").regex(".*fei.*"),
                Criteria.where("age").gte(30).lte(32)
        );
        // 创建查询对象
        Query query = new Query();
        // 添加限制条件
        query.addCriteria(criteria);
        List<User> list = mongoTemplate.find(query, User.class, "users");
        list.forEach(System.err::println);
    }
}

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

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

相关文章

Vue面试题合集(原理深入,持续更新)

2023Vue面试题剖析原理 18.生命周期有哪些19.Vue中的diff算法原理diff概念diff比较流程 20.Vue中key的作用和原理key的概念key的作用 21.Vue.use作用和原理use概念插件的功能实现原理 22.Vue.extend方法的作用Vue.extend概念原理分析 23.Vue组件中data为什么必须是函数24.函数式…

SqlServer的基本使用

本文章主要是交给大家SqlServer的基本用法&#xff0c;因为SqlServer本身的运行机制问题&#xff0c;会让很多人觉得sql语句是不是写错了&#xff1f;这个代码有问题&#xff1f; 文章目录 选中数据库语法报错&#xff1f;执行部分代码存储过程、触发器只能创建一次sql书写建议…

如何在Linux c/c++ 进行多播(组播)编程

第一章: 前言 多播技术&#xff0c;也被称为“组播”&#xff0c;是一种网络通信机制&#xff0c;它允许一个节点&#xff08;发送者&#xff09;向一组特定的节点&#xff08;接收者&#xff09;发送信息。这种方式在网络编程中非常有用&#xff0c;因为它可以大大提高效率和…

Git、GitFlow协作 、Git commit规范、语义化版本

目录 一、概述 二、Git 2.1 安装与配置 2.2 基本指令操作 2.3 创建一个新的存储库 2.4 推送一个已有的文件夹 2.5 忽略临时文件 2.6 添加commit模板 2.7 冲突解决 二、GitFlow协作 三、Git Commit规范 四、语义化版本 为什么需要语义化版本号&#xff1f; 什么是…

线段树为什么可以开三倍空间

参考链接 四倍空间的原因如上图所示&#xff0c;但是实际操作时&#xff0c;我们可以直接开三倍空间也是可以的。 原因分析&#xff1a; 由于在分割区间时&#xff0c;我们计算mid使用下取整&#xff0c;所以左边区间大小大于等于右边区间大小&#xff0c;如果要实现上图中的树…

智能路由器开发之创建一个procd init脚本示例

智能路由器开发之创建一个procd init脚本示例 Procd init脚本默认提供了许多好用的功能&#xff0c;例如重启策略和能够从UCI系统中存储和读取配置。 设置 举个例子&#xff0c;假设我们想创建一个作为服务的Shell脚本&#xff0c;并且这个服务可以通过消息和超时时间进行配…

C语言---初识指针

1、指针是什么 指针是什么&#xff1f; 指针理解的2个要点&#xff1a; ​ 1、指针是内存中一个最小单元的编号&#xff0c;也就是地址。 ​ 2、平时口语中说的指针&#xff0c;通常指的是指针变量&#xff0c;是用来存放内存地址的变量 总结&#xff1a;指针就是地址&#xff…

Docker+Jenkins+Gitee自动化部署maven项目,加入Nexus镜像仓库(补充篇)

1.前言 Hello&#xff0c;各位小伙伴&#xff0c;大家好&#xff01;&#xff01;&#xff01; 在【DockerJenkinsGitee自动化部署maven项目】一文中&#xff0c;我们介绍了如何使用Jenkins来实现自动化部署maven项目&#xff0c;没读过的小伙伴可以去回顾一下&#xff0c;这…

【求 一个人去给多个人拜年 的最短路径】【枚举所有 拜访顺序】新年好

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

ChatGPT 70个插件小测全纪录

以下插件排序按照 ChatGPT all plugins 列表,评分基于国人使用场景。 1)Polarr:用于处理和编辑图片的工具 Polarr插件可以帮助用户进行各种图片编辑任务,包括调整亮度、对比度、饱和度,应用滤镜,裁剪图片,以及其他一些高级的图片处理功能。这个插件可以让ChatGPT更好地…

章节1:XXE漏洞-上

章节1&#xff1a;XXE漏洞-上 01 XML基础知识 XML eXtensible Markup Language 可扩展标记语言 XML用途 配置文件 交换数据 XML内容 XML格式要求 XML文档必须有根元素XML文档必须有关闭标签XML标签对大小写敏感XML元素必须被正确的嵌套XML属性必须加引号 XML格式校验 …

耗时 48小时整理了网络安全学习路线,非常详细!

前言 上次发的文章【都2023年了&#xff0c;还在问网络安全怎么入门】很多小伙伴在评论区回复不知道怎么学习&#xff0c;我也反思了一下&#xff0c;确实没写到学习方法和路线&#xff0c;所以这一期就出一一个怎么学习网络安全的学习路线和方法&#xff0c;觉得有用的话三连…

mvn 打包jar包。 Docker 部署 jar 包程序

默认你已经安装了jdk和maven 并且配置了环境变量. 这里贴出自己的环境配置(mac) # Maven3.6.3 export M2_HOME/Users/cc/maven3.6.3/apache-maven-3.6.3 export M2$M2_HOME/bin export PATH$M2:$PATH# java8 export JAVA_HOME/Library/Java/JavaVirtualMachines/jdk1.8.0_36…

表白墙的实现【前后端交互】

目录 一、Servlet API 详解 1. HttpServletRequest 1.1 HttpServletRequest 方法 1.2 getParameter 2.HttpServletResponse 2.1 HttpServletResponse 方法 2.2 代码示例: 设置状态码 2.3 代码示例: 重定向 二、表白墙 1.准备工作 2.约定前后端交互接口 2.1 接口一…

项目引入Spring Security的参考步骤token

后端&#xff1a; 1、在数据库中创建t_user用户表&#xff0c;参照建表SQL。 2、pom文件中引入Spring Security依赖、JWT依赖&#xff08;复制粘贴即可&#xff09; <!--security--> <dependency> <groupId>org.springfr…

全志V3S嵌入式驱动开发(pwm驱动)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 pwm驱动也是常见的一种驱动方式。常见的pwm&#xff0c;其实就是一组方波&#xff0c;方波中的高低电平之比称之为空占比。通过调节这个空占比&…

前端学习--ES6模块化与异步编程高级用法

一、ES6模块化 1.1 概念与规则 ES6 模块化规范是浏览器端与服务器端通用的模块化开发规范 ES6 模块化规范中定义&#xff1a; 每个 js 文件都是一个独立的模块导入其它模块成员使用 import 关键字向外共享模块成员使用 export 关键字 1.2 在node.js体验es6模块化 配置如下&…

【问题】常见问题解决方法

记录在项目运行中遇到的问题&#xff0c;和常用的软件安装包 文章目录 安装包下载第一章&#xff1a;运行C/C小白运行须知1.DevC运行&#xff08;最简单&#xff0c;推荐&#xff09;2.Visual Studio 运行3.VC运行 第二章&#xff1a;运行C#项目1.VS环境2.打开C#项目启动失败&a…

LiteDram仿真验证(二):仿真中,DDR3初始化问题

目录 前言一、讨论1、[init_done never goes to 1 in simulation #145](https://github.com/enjoy-digital/litedram/issues/145)2、[Add ECP5 support to standalone core generator #106](https://github.com/enjoy-digital/litedram/issues/106)3、[Help generating DDR3 Ve…

【unity插件】2d切割破坏插件-Smart Slicer 2D

文章目录 效果1.切割2.破坏3.创建源码使用1.导入插件2.摄像机3.新建地面4.新建切割刀5.新建切割食物6. 运行即可不同slicer Type的切割刀类型测试1.线性2.Complex3.点4.多边形5.explode6.创建效果 1.切割