编辑
一、介绍
在介绍MongoDB之前首先介绍NoSQL非关系型数据库:通常用于关联较少且大规模的数据,其分类主要如下
类型 | 实例 |
文档型数据库 | MongoDB |
键值对数据库 | Redis、Voldemort、Scalaris |
列存储数据库 | Sybase IQ、Vertica |
图存储数据库 | Neo4j、FlockDB、GraphDB |
MongoDB是一种面向文档的半结构化的非关系型数据库,所谓的面向文档是一种类似JSON的结构称为BSON,因此可以简单理解MongoDB存储的是各种各样的JSON
MongoDB可以快速开发web型应用,因为存储的是BSON格式,因此无需像关系型数据库那样需要建表,非常的的灵活
编辑
二、安装部署
进入MongoDB官网 MongoDB Community Download | MongoDB
官网会根据你的电脑型号推荐最适合的MongoDB版本,Package选择msi就好了,因为相比于zip格式,msi是傻瓜模式,很多的基础配置自动帮你配置好,因此进入该官网只需要点击Download即可
编辑
在data目录中创建db文件夹
编辑
cmd终端配置数据库地址
mongod --dbpath E:\Mongodb\data\db
将Mongodb中的bin文件夹设置于环境变量中
编辑
在bin同级目录下创建mongodb.config文件,并在文件中配置日志和数据库存储路径信息
编辑
编辑
在bin目录中配置MongoDB启动关闭
编辑
mongod -dbpath "E:\Mongodb\data\db" -logpath "E:\Mongodb\log\mongo.log" -install -serviceName "MongoDB"
测试启动(注意一定要用管理员启动)
编辑
进入测试网站127.0.0.1:27017 ,如果出现以下内容则表示MongoDB启动成功
编辑
使用Navicat数据库管理工具创建自己的MongoDB数据库并进行连接
编辑
关闭服务器
编辑
三、基础知识
3.1 基本概念
下面表格对比了关系型数据库MySQL和非关系型数据库MongoDB
MySQL | MongoDB | Interpret |
database | database | 数据库 |
table | collection | Mysql称为表,MongoDB称为集合 |
row | document | Mysql称为数据行,MongoDB称为数据文档 |
column | field | Mysql称为数据列,MongoDB称为字段 |
primary key | primarykey | 主键 |
注意
1创建文档的时候可以不用预先创建数据库和集合,因为系统会自动创建
2 主键会自动创建维护,名字为 _id
3.2 数据类型
MongoDB支持以下的数据类型
数据类型 | 解释 |
String(字符串) | mongodb中的字符串是UTF-8有效的 |
Integer(整数) | 存储数值。整数可以是32位或64位,具体取决于您的服务器 |
Boolean(布尔) | 存储布尔(true/false)值 |
Double(双精度) | 存储浮点值 |
Object(对象) | 嵌入式文档 |
Date(日期) | 以UNIX时间格式存储当前日期或时间 |
Arrays(数组) | 将数组或列表或多个值存储到一个键中 |
Code(代码) | 将JavaScript代码存储到文档中 |
Regular expression(正则表达式) | 存储正则表达式 |
Binary data(二进制数据) | 存储二进制数据 |
Object ID(对象ID) | 存储文档ID |
Symbol(符号) | 与字符串相同,用于具有特定符号类型的语言 |
Null (空值) | 存储Null值 |
imestamp(时间戳) | 存储时间戳 |
Min/ Max keys(最小/最大键) | 将值与最低和最高BSON元素进行比较 |
3.3 基本操作
操作 | 作用 |
mongo | 连接数据库 |
db | 查看当前操作的数据库 |
use *** | 切换到指定数据库 |
show databases | 查看所有的数据库 |
show collections | 查看当前数据库中的所有集合 |
四、CRUD
4.1 增加文档
db为操作的数据库,collection为操作的集合
一般我们都使用万能插入
操作 | 语句 |
增加一条数据 | db.collectionName.insertOne({name:'老大'}) |
增加多条数据 | db.collectionName.insertMany([{name:'老大'},{name:'老二'}]) |
万能插入 | db.collectionName.insert({name:'老三'}) db.collectionName.insert({name:'老四'},{name:'老五'}) |
// 插入一条数据 db.user.insertOne({ name:String('老大'),age:14,} ) // 插入多条数据 db.user.insertMany([ {name:String('老三'),age:12,}, {name:String('老四'),age:11,} ])
编辑
4.2 删除文档
操作 | 语句 |
删除一个文档 | db.collectionName.deleteOne(条件) |
删除所有文档 | db.collectionName.deleteMany(条件) |
万能删除 | db.collectionName.remove(条件) |
// 删除一条年龄14岁的小伙伴,数据表中最早创建的数据 db.user.deleteOne({age:14})
4.3 修改文档
操作 | 语句 |
修改一个文档 | db.collectionName.update(条件,修改) |
修改多个文档 | db.collectionName.updateOne(条件,修改) |
万能修改 | db.collectionName.updateMany(条件,修改) |
// 单个修改,将老大年龄修改为15 db.user.updateOne({name:'老大'},{$set:{age:15}})
4.4 查询文档
操作 | 语句 |
查询所有文档 | db.collectionName.find() db.collectionName.find({}) |
条件查询 | db.collentionName.find({条件}) |
条件查询对象第一个 | db.collentionName.findOne({条件}) |
// 查询user集合全体数据 db.user.find() // 查询老大信息 db.user.find({name:'老大'}) // 查询所有14岁的好兄弟,并返回第一条查询的结果 db.user.findOne({age:14})
五、SpringBoot集成
我们需要在依赖中导入spring-data-mongodb,其主要提供了MongoTemplate和MongoRepository两种方式来访问Mongodb,前者功能强大,后者操作简单
5.1 环境配置
配置xml文件
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>
配置application.properties文件
格式:mongodb://用户名:用户密码@主机地址:27017/数据库名?
spring.data.mongodb.uri:mongodb://root:123456@localhost:27017/mongodbdemo?maxIdleTimeMS=86400000
5.2 基于MongoRepository实现CRUD
只需要接口继承MongoRepository即可使用其内置的各种方法。但是要注意定义名要符合Restful风格。类似于Mybatis-plus和JPA
@Repository public interface UserMapper extends MongoRepository<User,String> { User getUserByUsername(String username); }
5.3 基于MongoTemplate实现CRUD
一般是当业务非常复杂时,内置的MongoRepository方法难以实现时才使用该方法,该方式需要写Mapper接口以及MapperImpl实现类。
在MapperImpl中使用的查询语句是使用Templat中的语法。
因此直观的来讲,要想完成一个业务有两种方法,第一种是在业务方法中调用多个使用MongoRepository的Mapper方法,另一种方法是一个业务调用少量功能十分强大的MongoTemplate方法
public interface UserMa { void deleteById(String userName); }
Repository public class UserMapperImpl implements UserMapper { @Autowired private MongoTemplate template; @Override public void deleteById(String userName) { Query query = new Query(); query.addCriteria(Criteria.where("userName").is(userName)); template.remove(query, NewUser.class); } }