无锡宏腾网站建设,湖南人工智能建站系统软件,个人网站模板html 下载,个人小程序开发教程1. 什么是MongoDB
1.1. 基本概念
MongoDB是一个基于分布式文件存储 [1] 的数据库。由C语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个介于关系数据库和非关系数据库之间的产品#xff0c;是非关系数据库当中功能最丰富#xff0c;最像关系数…1. 什么是MongoDB
1.1. 基本概念
MongoDB是一个基于分布式文件存储 [1] 的数据库。由C语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个介于关系数据库和非关系数据库之间的产品是非关系数据库当中功能最丰富最像关系数据库的。它支持的数据结构非常松散是类似json的bson格式MongoDB存储的是BSON文档因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大其语法有点类似于面向对象的查询语言几乎可以实现类似关系数据库单表查询的绝大部分功能而且还支持对数据建立索引。
上面说到MongoDB是介于关系型数据库和非关系型数据库之间的产品其实更多的人把MongoDB直接当成关系数据库其实这都不重要重要的是我们需要搞清楚关系型数据库如Mysql。非关系型数据库如Redis和MongDB他们的区别以及使用场景
高性能 数据写入内存即完成持久化到硬盘的操作在后台异步完成。同时副本集的读写分离分片模式的多写可以更大程度的提高吞吐量
高可用 副本集模式会将数据同步在一到多个副本服务器并支持故障自动转移同时提供了数据的冗余备份提高了数据的可用性 保证了数据的安全性
1.2. 数据的存储
对于数据管理来说Mysql关系型数据库的数据是存储到磁盘的每次进行数据的读写都涉及到IO操作它以二维表的方式来展现数据可以很方便的描述对象以及对象之间的关系。它的性能瓶颈就是IO造成的高并发读写能力较弱。
而对于MongoDB而言它的数据其实是存储到磁盘上的所有要操作的数据都是通过mmap(内存映射文件)的方式映射到内存中数据的操作就基于这片内存进行处理的避免了磁盘的零碎操作性能也是非常高的。当然mmap中的数据会flush到磁盘上。
Mysql通过二维表的方式来存储数据支持索引事务等MongoDB 的文件存储是BSON格式【BSON是一种类json的一种二进制形式的存储格式,简称Binary JSON】类似JSON相对于JSON有更快的遍历速度而且数据类型更多。查询功能比较强大能存储海量数据但是不支持事务
mmap 是一种内存映射文件的方法即将一个文件或者其它对象映射到进程的地址空间实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后进程就可以采用指针的方式读写操作这一段内存而系统会自动回写页面到对应的文件磁盘上即完成了对文件的操作而不必再调用 read、write 等系统调用函数。相反内核空间对这段区域的修改也直接反映用户空间从而可以实现不同进程间的文件共享
2.MongoDB的概念 SQL术语/概念 MongoDB术语/概念 解释/说明 database database 数据库 table collection 数据库表/集合 row document 数据记录行/文档 column field 数据字段/域 index index 索引 table joins 表连接,MongoDB不支持 primary key primary key 主键,MongoDB自动将_id字段设置为主键
2.1. 数据库database
一个mongodb中可以建立多个数据库默认数据库为db数据库存储在data目录中不同的数据库也放置在不同的文件中数据库也通过名字来标识。
MongoDB默认保留了几个数据库
admin : admin数据库则主要存储MongoDB的用户、角色等信息。local : local数据库主要存储副本集的元数据它只会在本地存储数据config : 当Mongo用于分片设置时config数据库在内部使用用于保存分片的相关信息。
2.2. 文档document
通常一个对象可以映射成一个文档文档是一组键值(key-value)对(即 BSON,类似于JSON)。MongoDB 的文档不需要设置相同的字段并且相同的字段不需要相同的数据类型这与关系型数据库有很大的区别也是 MongoDB 非常突出的特点。比如在数据库中的2行数据 id username age 1 zs 19 2 ls 19
在MongoDB中的体现
{_id : ObjectId(605d9a0b4d99251c4e70bd6d),username : zs,id : 1,age : 19,title : ls
}
{_id : ObjectId(605d9a0b4d99251c4e70bd6e),username : ls,id : 2,age : 19
} 2.3. 集合collections
一个集合包含一堆 MongoDB 文档如果把Mysql中的一行数据当做一个文档一张表格就相当于是MongoDB中的集合
集合存在于数据库中集合没有固定的结构这意味着你在对集合可以插入不同格式和类型的数据但通常情况下我们插入集合的数据都会有一定的关联性。
3. 命令操作数据库和集合
创建数据库use 数据库名 - 如果数据库不存在则创建并切换到该数据库存在则切换到该数据库删除数据库先切换到数据库然后使用db.dropDatabase()删除
创建集合db.createCollection(集合名/表名)查看所有集合show collections删除集合db.集合名.drop()
添加数据db.集合名.insert({bson格式}) - 其实可以直接添加数据自动创建集合
修改数据使用update()和save()方法来更新集合中的文档save()如果有_id就是修改没有就是添加
删除数据:db.集合名.remove({bson格式})
查询数据db.集合名.find(query)如果不传query就是查询所有如果传递了query就是按条件查询格式也是bson格式
4.MongoDB的权限管理
4.1. 内置角色
在MongDB中内置了一些用户角色roles 编号 说明 角色 1 数据库用户角色 readreadWrite 2 数据库管理角色 dbAdmindbOwneruserAdmin 3 集群管理角色 clusterAdminclusterManagerclusterMonitorhostManager 4 备份恢复角色 backuprestore 5 所有数据库角色 readAnyDatabasereadWriteAnyDatabaseuserAdminAnyDatabasedbAdminAnyDatabase 6 超级用户角色 root
下面是每一种角色的解释 编号 角色 解释 1 read 允许用户读取指定数据库 2 readWrite 允许用户读写指定数据库 3 dbAdmin 允许用户在指定数据库中执行管理函数如索引创建、删除查看统计或访问system.profile 4 userAdmin 允许用户向system.users集合写入可以向指定数据库里创建、删除和管理用户 5 clusterAdmin 只在admin数据库中可用具有所有分片和复制集相关函数的管理权限。 6 readAnyDatabase 只在admin数据库中可用具有所有数据库的读权限 7 readWriteAnyDatabase 只在admin数据库中可用具有所有数据库的读写权限 8 userAdminAnyDatabase 只在admin数据库中可用具有所有数据库的userAdmin权限 9 dbAdminAnyDatabase 只在admin数据库中可用具有所有数据库的dbAdmin权限。 10 root 只在admin数据库中可用。超级账号超级权限
4.2. 命令创建管理员账号
windows中cmd命令窗口输入mongo切换到mongodb的命令窗口。查看数据库 show dbs
# 只显示有集合的数据库
切换admin数据库 use admin
查看用户 show users
# 只显示当前数据库的用户
创建超级用户
db.createUser(
{user: root,pwd: 123456,roles: [ { role: root, db: admin } ]
} )
# user : 用户名
# pwd : 密码
# roles : 角色
# db : 数据库
开启认证修改配置文件 bin/mongod.cfg 增加如下内容
security:authorization: enabled
修改之后重启mongdb服务 重新连接mongdb
5.springBoot集成Mongodb
5.1.直接使用MongoTemplate
第一步创建项目导入基础依赖SpringBoot和MongoDB
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-mongodb/artifactId
/dependency
第二步yml配置mongodb
spring:data:mongodb:uri: mongodb://root:123456127.0.0.1:27017/blog?authSourceadminauthMechanismSCRAM-SHA-1#uri: mongodb://用户名:密码127.0.0.1:27017/数据库?authSourceadminauthMechanismSCRAM-SHA-1 #注意这里用户名密码要写管理员账号写用户账号不能操作数据
第三步配置实体类,pringData提供了Document注解来标记文档对象
Data
Document(collection article)//实体类对应mongodb的表/文档article
public class BlogArticle {Id //对应mongodb的表的_id添加时不设置_id会自动增长private String _id;private Integer id;//文章名称Field(name name,targetType FieldType.STRING)private String username;//文章标签Field(name age,targetType FieldType.INT32)private Integer age;//文章简介private String address;private String tel;
}
第四步注入MongoTemplate直接调用其API
常用api //1.查询所有template.findAll(BlogArticle.class).forEach(System.out::println);//2.通过id查询单个System.out.println(template.findById(63a92c4b2682f13e9b06472a, BlogArticle.class));//3.通过条件查询单个如果有多条数据只返回第一条Query query new Query(Criteria.where(articleName).is(测试数据1-博客名));System.out.println(template.findOne(query, BlogArticle.class));//4.通过条件查询所有符合条件的数据返回ListQuery query new Query(Criteria.where(articleName).is(测试数据1-博客名));template.find(query, BlogArticle.class).forEach(System.out::println);//5.查询满足条件的总条数查询articleName为测试数据1-博客名并且articleState为1的文档数量Query query new Query(Criteria.where(articleName).is(测试数据1-博客名).and(articleState).is(1));System.out.println(template.count(query, BlogArticle.class));//2//6.分页查询查询第二页的数据Integer currentPage 2;Integer pageSize 3;Query query new Query();template.find(query.skip((currentPage - 1) * pageSize).limit(pageSize),BlogArticle.class).forEach(System.out::println);//7.模糊查询Criteria criteria new Criteria();//以*任意字符开始以*任意字符结尾忽略大小写Pattern compile Pattern.compile(^.* 博客 .*$, Pattern.CASE_INSENSITIVE);//文章名正则匹配criteria.and(articleName).regex(compile);Query query new Query(criteria);template.find(query,BlogArticle.class).forEach(System.out::println);
5.2.实现MongoRepository
第一步实现MongoRepository自定义方法
/*** 持久化接口: 评论Comment*/
Repository //将当前接口的实例交给Spring管理 - service注入使用
public interface CommentRepository extends MongoRepositoryComment,String {/*** 根据文章id查询文章的所有评论* findBy是一种语法格式ArticleId不能写错,.必须要与Comment实体的字段对应* param articleId* return*/ListComment findByArticleId(Long articleId);
}
第二步注入MongoRepository实现类使用
6.MongoRepository实现分页查询 Overridepublic Object queryPage(ArticleMongoQuery query) {//文章对象Comment comment new Comment();//查询条件comment.setArticleId(query.getArticleId());comment.setCreateTime(null);//设置mongo查询条件ExampleComment example Example.of(comment, ExampleMatcher.matching().withIgnorePaths(createTime));//设置分页条件mongo默认从第0页开始Pageable pageRequest PageRequest.of(query.getCurrentPage()-1, query.getPageSize());PageComment all commentRepository.findAll(example, pageRequest);return all;}