概述
MongoDB是一个基于分布式文件存储的数据库.MongoDB是非关系数据库,数据结构非常松散,是类似json的bson格式,可以存储比较复杂的数据类型.
特点
- 高性能
- 易部署
- 易使用
- 非常方便的存储数据
对比MySQL
MongoDB | MySQL | |
---|---|---|
数据库模型 | 非关系型 | 关系型 |
存储方式 | 虚拟内存+持久化 | 不同的引擎有不同的存储方式 |
查询语句 | 独特的MongoDB查询方式 | 传统的SQL语句 |
构架特点 | 可以通过副本集,以及分片来实现高可用 | 常见有单点,M-S,MHA,MMM,cluster等架构方式 |
数据处理方式 | 基于内存,将热数据存在物理内存中,从而达到高速读写 | 不同的引擎拥有其自己的特点 |
成熟度 | 新兴数据库,成熟度较低 | 拥有较为成熟的体系,成熟度较高 |
广泛度 | NoSQL数据库中,MongoDB是较为完善的DB之一,使用人群也在不断增长 | 开源数据库 |
数据结构
MongoDB属于NoSQL数据库,没有表相关概念,该数据库存储使用的是集合,集合中存储的是文档(树状结构数据)
基本操作
语法
- show dbs: 查询所有数据库
- use 数据库名: 创建并且选中数据库,数据库已经存在则直接选中
- db: 查询当前选择的数据库
- db.dropDatabase(): 删除当前选中的数据库
- show collections: 查询当前库中的集合
- db.createCollection(“集合名”): 创建集合 db.集合名.drop(): 删除集合
- 注意: db.集合名 == db.getCollection(“集合名”)
数据类型
String(字符串): mongodb中的字符串是UTF-8有效的
Integer(整数): 存储数值。整数可以是32位或64位,具体取决于您的服务器
Boolean(布尔): 存储布尔(true/false)值
Double(双精度): 存储浮点值
Arrays(数组): 将数组或列表或多个值存储到一个键中
Timestamp(时间戳): 存储时间戳
Object(对象): 嵌入式文档
Null (空值): 存储Null值
Symbol(符号): 与字符串相同,用于具有特定符号类型的语言
Date(日期): 以UNIX时间格式存储当前日期或时间
Object ID(对象ID) : 存储文档ID
Binary data(二进制数据): 存储二进制数据
Code(代码): 将JavaScript代码存储到文档中
Regular expression(正则表达式): 存储正则表达式
语法
往集合中新增文档,当集合不存在时会自动先创建集合,再往集合中添加文档,但是不要依赖自动创建集合的特性.
插入操作
- db.集合名.insert(文档):往集合中插入一个文档
- db.集合名.find():查询集合中所有文档
1 | db.users.insert({id: NumberLong(1), name: "蛤蛤", age: NumberInt(18)}) |
不写包装类型,默认是Double类型
更新操作
1 | db.集合名.update( |
- query:update的查询条件,类似sql update查询,where的条件
- update:update的对象和一些更新的操作符,sql update查询,set的值
- upsert:可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入
- multi:可选,MongoDB默认是false,只更新找到的第一条记录,如果这个参数为true,就把条件查出来,多条记录全部更新
- writeConcern :可选,抛出异常的级别
简化方法:
更新1个:db.集合名.updateOne( … )
更新所有:db.集合名.updateMany( … )
1 | //修改一条数据 |
删除操作
1 | db.集合名.remove( |
简化方法:
- 删除1个: db.集合名.deleteOne(…)
- 删除所有: db.集合名.deleteMany(…)
参数说明:
- query: (可选)删除的文档条件
- justOne:(可选)如果设为true或1,则只删除一个文档,如果设置不修改该参数.使用默认值false,则删除所有匹配条件的文档
- writeConcern:(可选)抛出异常的级别
1 | //删除_id(文档id)为xxx的文档 |
查询操作
- db.集合名.find(query, projection)
db.集合名.find(…).pretty()
query: 可选, 使用查询操作符指定查询条件
- projection: 可选,使用投影操作符指定返回的键.查询时返回文档中所有的键值,只需要省略该参数即可(默认省略)
- 调用pretty()可以格式化查询的内容
实例
1 | //查询所有文档 |
排序查询
1 | db.users.find().sort({字段: 1}) ---> 按照字段升序排列 |
分页查询
1 | skip(num): 跳过num个文档,相当于start |
高级查询
等值
find({字段: 值})
比较查询
语法 -> find({字段: {比较操作符: 值, …}})
比较操作符
符号 | 表达式 |
---|---|
> | $gt |
< | $lt |
>= | $gte |
<= | $lte |
!= | $ne |
集合运算 $in 如: {name: {$in: [“蛤蛤”, “嘤嘤”]}}
判断存在 $exists 如: {name: {$exists: true}}
逻辑查询
语法 -> find({逻辑操作符: [条件1, 条件2, …]})
逻辑操作符
符号 | 作用 | ||
---|---|---|---|
(&&) | $and | ||
(\ | \ | ) | $or |
(!) | $not |
模糊查询
MongoDB的模糊查询使用的js的正则表达式的语法
{name: {$regex: /^.keyword.$/}}
设置用户
1 | //选择admin数据库 |
Spring Boot Data MongoDB
依赖
1 | <dependency> |
配置连接参数
1 | # application.properties |
注入mongoTemplate
使用mongoTemplate对象的api方法
1 |
|
mongoTemplate.方法名() | 作用 |
---|---|
insert(type, collectionName) | 往集合中添加文档,返回的对象中包含数据库生成的_id |
updateFirst(query, update, collectionName) | 更新集合中第一个找到的方法 |
updateMulti(…) | 更新集合中所有找到的文档 |
remove(query, collectionName) | 删除集合中找到的所有文档 |
findById(id, class, collectionName) | 返回根据id找到的文档 |
findAll(class, collectionName) | 查询集合中所有的文档 |
find(query, class, collectionName) | 根据条件查询集合中的文档 |
- update —> 设置更新的内容
- query —> 通过Query对象的addCriteria把条件封装到Query对象中
- class —> Xxx.class,根据反射创建对象.
条件限定
Query对象用于封装查询条件,配合Criteria一起使用,来完成各种条件的描述
Criteria对象设置了一个限定条件
Criteria.where(“key”).is(value) //设置了一个等值条件
Criteria.orOperator(Criteria对象,…) //设置一个或多个或的条件
andOperator //设置一个或多个与的条件
Criteria.where(String key).regex(String regex); //模糊查询
Query对象.addCriteria(Criteria criteria); //添加查询条件
Query对象.skip(start).limit(pageSize); //分页查询
1 |
|