MongoDB 认识
MongoDB是一个基于分布式文件存储的数据库,由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
MongoDB它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。其CRUD语法有点类似于面向对象的查询语言。
MongoDB服务端可运行在Linux、Windows或mac os x平台,支持32位和64位应用,推荐64位,默认端口为27017。
MongoDB 主要特点
1.文档
MongoDB中的记录是一个文档(Document),它是由字段和值对组成的数据结构。MongoDB文档类似于JSON对象。字段的值可以包括其他文档,数组和文档数组。
文档中的值类型不仅可以是双引号中的字符串,也可以是其他的数据类型,例如,整型、布尔型等,也可以是另外一个文档,即文档可以嵌套。文档中的键类型只能是字符串。
2.集合
集合就是一组文档,类似于关系数据库中的表。集合是无模式的,集合中的文档可以是各式各样的。例如,{“helloword”:“Mike”}和{“foo”: 3},它们的键不同,值的类型也不同,但是它们可以存放在同一个集合中。
既然集合中可以存放任何类型的文档,那么为什么还需要使用多个集合?
- 开发、维护、管理效率?
- 对集合的CRUD操作效率?
- 例如,通常对于网站的日志记录,可以根据日志的级别进行存储,Info级别日志存放在Info 集合中,Debug 级别日志存放在Debug 集合中…
可以使用
“.”按照命名空间将集合划分为子集合。使用子集合组织数据结构更清晰,如blog下面的blog.user和blog.article3. 数据库
一个MongoDB 实例可以承载多个数据库。它们之间可以看作相互独立,每个数据库都有独立的权限控制。在磁盘上,不同的数据库存放在不同的文件中。
MongoDB 中存在以下系统数据库。Admin 数据库:一个权限数据库,如果创建用户的时候将该用户添加到admin 数据库中,那么该用户就自动继承了所有数据库的权限。
- Local 数据库:这个数据库永远不会被复制,可以用来存储本地单台服务器的任意集合。
- Config 数据库:当MongoDB 使用分片模式时,config 数据库在内部使用,用于保存分片的信息。
安装MongoDB
Linux上安装MongoDB
官网地址:https://fastdl.mongodb.org1.通过Docker安装:
https://www.runoob.com/docker/docker-install-mongodb.html2.通过安装包安装:
https://blog.csdn.net/qq_41107231/article/details/108028319
使用Xftp将压缩包上传到指定目录下
创建mongodb数据存储文件和日志文件cd /opt/mkdir mongodbtar -zxvf mongodb-linux-x86_64-4.0.13 #文件名根据你自己的压缩包文件名来
mongodb.conf配置文件:cd /opt/mongodb/mkdir datamkdir logscd ./logstouch mongodb.logcd ../mkdir etccd etctouch mongodb.conf
将mongodb服务加入环境变量#数据库路径dbpath=/opt/mongodb/data#日志输出文件路径logpath=/opt/mongodb/logs/mongodb.log#错误日志采用追加模式logappend=true#启用日志文件,默认启用journal=true#这个选项可以过滤掉一些无用的日志信息,若需要调试使用请设置为falsequiet=true#端口号 默认为27017port=27017#允许远程访问bind_ip=0.0.0.0#开启子进程fork=true#开启认证,必选先添加用户,先不开启(不用验证账号密码)#auth=true
vim /etc/profile
在最后一行添加:export PATH=$PATH:/usr/local/mongodb/mongodb-linux-x86_64-amazon-5.0.2/bin #文件名根据你自己的压缩包文件名来
使配置文件生效:source /etc/profileWindows上安装MongoDB
https://www.cnblogs.com/TM0831/p/10606624.html启动/关闭mongodb服务
1.在mongodb的安装目录下的bin目录下启动服务./mongod --config /opt/mongodb/etc/mongodb.conf
2.查看mongodb是否已经启动成功netstat -lanp | grep "27017"
显示如下进程,说明已经成功启动
3.关闭mongodb服务db.shutdownServer()操作mongo数据库
任意目录下,输入命令mongo即可进入数据库(配置了环境变量的前提下),否则需要在mongodb安装目录下的bin目录下使用 ./mongo 命令
显示如下,已经成功进入mongo数据库了,默认是进入的是test数据库,show dbs 查看当前所有数据库。
注意:如果一个数据库是没有安全认证的,不使用用户名密码即可登陆,这样是不安全的,所以我们应当授予权限才能操作数据库,这样再企业中才能保证数据安全性。添加用户、安全认证
首先必须使用admin数据库,进行新用户授权.
MongoDB副本集默认会创建local、admin数据库,local数据库主要存储副本集的元数据,admin数据库则主要存储MongoDB的用户、角色等信息。
use admin
输入以下命令:db.createUser({user:"root",pwd:"123456",roles:[{role:"root",db:"admin"}]})
授权成功后,关闭mongo服务:db.shutdownServer()
查看mongo服务进程,可看到服务已经成功停掉了. netstat -lanp | grep "27017"
然后需要到配置文件中修改配置,启用安全认证。
auth=true #开启认证,必选先添加用户
最后开启mongo服务,进入数据库测试:./mongod --config /opt/mongodb/etc/mongodb.conf
show dbs此时看不到任何数据库,说明我们的安全认证用户配置生效了。
首先使用use admin通过db.auth(‘root’,‘密码’) 输出1就是验证成功。use admindb.auth('root','123456')
MongoDB 的基本操作(增、删、改、查)
参考1:https://blog.csdn.net/nanhuaibeian/article/details/108209689
参考2:https://blog.csdn.net/Alen_Liu_SZ/article/details/100528989
MongoDB 整合Springboot
Mongodb开发文档API: https://docs.spring.io/spring-data/mongodb/docs/2.1.5.RELEASE/api/
参考链接:https://blog.csdn.net/qq_46672746/article/details/118859786
准备数据库
use test#如果数据库不存在,则创建数据库,否则切换到指定数据库
db.createCollection( "collName");**`**#创建一个集合(table)`
db.getCollection("user");#得到指定名称的集合(table )
#示例:插入db.User.save({name:‘zhangsan’,age:21,sex:true})db.User.find(){"_id": Objectld(“4f69e680c9106ee2ec95da66”), “name”: “zhangsan”, “age”: 21,“sex”: true}
准备环境
引入mongodb依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId><version>2.2.1.RELEASE</version></dependency>
添加配置
spring.data.mongodb.host=XXX.XXX.XXX.XXX #服务器或虚拟机的IP(192.168.72.20)spring.data.mongodb.port=27017spring.data.mongodb.database=yygh_hosp
实体类
@Data@Document("User")public class User {@Idprivate String id;private String name;private Integer age;private String email;private String createDate;}
一、基于MongoTemplate 开发CRUD
添加、查询所有
@SpringBootTestclass MongodbApplicationTests {@Autowiredprivate MongoTemplate mongoTemplate;//添加@Testpublic void createUser() {User user = new User();user.setAge(20);user.setName("test");user.setEmail("4932200@qq.com");User user1 = mongoTemplate.insert(user);System.out.println(user1);}//查询所有@Testpublic void findUser() {List<User> userList = mongoTemplate.findAll(User.class);System.out.println(userList);}}
其他常用查询
//根据id查询@Testpublic void getById() {User user =mongoTemplate.findById("5ffbfa2ac290f356edf9b5aa", User.class);System.out.println(user);}//条件查询@Testpublic void findUserList() {Query query = new Query(Criteria.where("name").is("test").and("age").is(20));List<User> userList = mongoTemplate.find(query, User.class);System.out.println(userList);}//模糊查询@Testpublic void findUsersLikeName() {String name = "est";String regex = String.format("%s%s%s", "^.*", name, ".*$");Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);Query query = new Query(Criteria.where("name").regex(pattern));List<User> userList = mongoTemplate.find(query, User.class);System.out.println(userList);}//分页查询@Testpublic void findUsersPage() {String name = "est";int pageNo = 1;int pageSize = 10;Query query = new Query();String regex = String.format("%s%s%s", "^.*", name, ".*$");Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);query.addCriteria(Criteria.where("name").regex(pattern));int totalCount = (int) mongoTemplate.count(query, User.class);List<User> userList = mongoTemplate.find(query.skip((pageNo - 1) * pageSize).limit(pageSize), User.class);Map<String, Object> pageMap = new HashMap<>();pageMap.put("list", userList);pageMap.put("totalCount",totalCount);System.out.println(pageMap);}
修改
//修改@Testpublic void updateUser() {User user = mongoTemplate.findById("5ffbfa2ac290f356edf9b5aa", User.class);user.setName("test_1");user.setAge(25);user.setEmail("493220990@qq.com");Query query = new Query(Criteria.where("_id").is(user.getId()));Update update = new Update();update.set("name", user.getName());update.set("age", user.getAge());update.set("email", user.getEmail());UpdateResult result = mongoTemplate.upsert(query, update, User.class);long count = result.getModifiedCount();System.out.println(count);}
删除
//删除操作@Testpublic void delete() {Query query =new Query(Criteria.where("_id").is("5ffbfa2ac290f356edf9b5aa"));DeleteResult result = mongoTemplate.remove(query, User.class);long count = result.getDeletedCount();System.out.println(count);}
二、基于MongoRepository开发CRUD
第一步:创建一个interface继承MongoRepository接口,如下:
第二步:将接口注入即可使用(@Autowired UserRepository xxx;)
第三步:调用接口的方法,实现CRUD操作
添加
//添加@Testpublic void createUser() {User user = new User();user.setAge(20);user.setName("张三");user.setEmail("3332200@qq.com");User user1 = userRepository.save(user);}
查询
//查询所有@Testpublic void findUser() {List<User> userList = userRepository.findAll();System.out.println(userList);}//id查询@Testpublic void getById() {User user = userRepository.findById("5ffbfe8197f24a07007bd6ce").get();System.out.println(user);}//条件查询@Testpublic void findUserList() {User user = new User();user.setName("张三");user.setAge(20);Example<User> userExample = Example.of(user);List<User> userList = userRepository.findAll(userExample);System.out.println(userList);}//模糊查询@Testpublic void findUsersLikeName() {//创建匹配器,即如何使用查询条件ExampleMatcher matcher = ExampleMatcher.matching() //构建对象.withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) //改变默认字符串匹配方式:模糊查询.withIgnoreCase(true); //改变默认大小写忽略方式:忽略大小写User user = new User();user.setName("三");Example<User> userExample = Example.of(user, matcher);List<User> userList = userRepository.findAll(userExample);System.out.println(userList);}//分页查询@Testpublic void findUsersPage() {Sort sort = Sort.by(Sort.Direction.DESC, "age");//0为第一页Pageable pageable = PageRequest.of(0, 10, sort);//创建匹配器,即如何使用查询条件ExampleMatcher matcher = ExampleMatcher.matching() //构建对象.withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) //改变默认字符串匹配方式:模糊查询.withIgnoreCase(true); //改变默认大小写忽略方式:忽略大小写User user = new User();user.setName("三");Example<User> userExample = Example.of(user, matcher);//创建实例Example<User> example = Example.of(user, matcher);Page<User> pages = userRepository.findAll(example, pageable);System.out.println(pages);}
修改
//修改@Testpublic void updateUser() {User user = userRepository.findById("5ffbfe8197f24a07007bd6ce").get();user.setName("张三_1");user.setAge(25);user.setEmail("883220990@qq.com");User save = userRepository.save(user);System.out.println(save);}
删除
//删除@Testpublic void delete() {userRepository.deleteById("5ffbfe8197f24a07007bd6ce");}
