MongoDB

概述

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
2
db.users.insert({id: NumberLong(1), name: "蛤蛤", age: NumberInt(18)})
db.users.insert({id: 2, name: "cscar", age: 20})

不写包装类型,默认是Double类型

更新操作

1
2
3
4
5
6
7
8
9
db.集合名.update( 
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
  • 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
2
3
4
5
6
//修改一条数据
db.users.update({name: "蛤蛤"}, {$set: {age:22}})
db.users.updateOne({name: "咕咕"}, {$set: {age:30}})
//修改所有数据
db.users.update({name: "蛤蛤"}, {$set: {name: "蛤蛤", age: 20}}, {multi: true})
db.users.updateMany({name: "蛤蛤"}, {$set: {name: "呼呼", age: 22}})

删除操作

1
2
3
4
5
6
7
db.集合名.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)

简化方法:

  • 删除1个: db.集合名.deleteOne(…)
  • 删除所有: db.集合名.deleteMany(…)

参数说明:

  • query: (可选)删除的文档条件
  • justOne:(可选)如果设为true或1,则只删除一个文档,如果设置不修改该参数.使用默认值false,则删除所有匹配条件的文档
  • writeConcern:(可选)抛出异常的级别
1
2
3
4
5
6
7
8
//删除_id(文档id)为xxx的文档
db.users.deleteOne({_id: objectId("xxx")})
//删除1个带有name=蛤蛤的文档
db.users.deleteOne({name: "蛤蛤"})
//删除所有带有name=蛤蛤的文档
db.users.deleteMany({name: "蛤蛤"})
//删除当前数据库中所有的文档
db.users.deleteMany()

查询操作

  • db.集合名.find(query, projection)
  • db.集合名.find(…).pretty()

  • query: 可选, 使用查询操作符指定查询条件

  • projection: 可选,使用投影操作符指定返回的键.查询时返回文档中所有的键值,只需要省略该参数即可(默认省略)
  • 调用pretty()可以格式化查询的内容

实例

1
2
3
4
//查询所有文档
db.users.find()
//查询所有文档,并且格式化打印
db.users.find().pretty()

排序查询

1
2
db.users.find().sort({字段: 1}) ---> 按照字段升序排列
db.users.find().sort({字段: -1}) ---> 按照字段降序排列

分页查询

1
2
3
4
skip(num): 跳过num个文档,相当于start
limit(num): 限制显示num个文档,相当于pageSize
如:
db.users.find().skip(num).limit(num)

高级查询

等值

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
2
3
4
5
//选择admin数据库
use admin
//添加一个超级管理员账号
db.createUser({user: "root", pwd: "admin", roles: ["root"]})
//user:账号 pwd:密码 roles:角色->root超级管理员

Spring Boot Data MongoDB

依赖

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

配置连接参数

1
2
3
4
5
6
# application.properties
# 配置数据库连接
# 格式:MongoDB: //账号:密码 @ip:端口/数据库?认证数据库
spring.data.mongodb.uri=mongodb://root:admin@localhost(端口)/数据库?authSource=admin
# 配置mongoTemplate的执行日志
logging.level.org.springframework.data.mongodb.core=debug

注入mongoTemplate

使用mongoTemplate对象的api方法

1
2
@Autowired
private MongoTemplate mongoTemplate;
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
2
3
4
5
6
7
8
9
10
11
12
@Test
public void testQuery3() {
Criteria name = Criteria.where("name").is("cai xv kun");
Criteria age = Criteria.where("age").lt(30);
//"或者"条件
Criteria criteria = new Criteria().orOperator(name, age);
Query query = new Query();
query.addCriteria(criteria);

List<User> users = mongoTemplate.find(query, User.class, "users");
System.err.println(users);
}