MongoDB是一个文档数据库,由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB目前在数据库总排名第5,在NoSQL数据库排名首位,是当前最流行的数据库之一。
注意:这里所指文档并非我们一般理解的 PDF,WORD 文档,而是来自于“JSON Document”,以 JSON 为数据模型。官方介绍详见:MongoDB官网
(1)数据结构非常松散,数据格式是BSON(Binary JSON) ,其结构是面向对象的而不是二维表,因此可以存储比较复杂的数据类型。
①数据模型与对象模型接近,开发代码量低 ②这样的数据模型有利于提供高读写的能力,增强吞吐量。
③数据模型因为是面向对象的,所以可以表示丰富的、有层级的数据结构,比如能把“评论”直接怼到“文章“的文档中,而不必创建三张表来描述这样的关系
(2)支持对数据建立索引,及时查询能力强。原则上 Oracle 和MySQL 能做的事情,MongoDB 都能做(包括 ACID 事务)。
(3)易伸缩,提供了分片能力,能对数据集进行分片,数据的存储压力分摊给多台服务器
(4)自动故障转移,MongoDB自身提供了副本集,能检测主节点是否存活,当失活时能自动提升从节点为主节点,达到故障转移。
(5)数据恢复功能,MongoDB提供了Journaling日志的概念,类似mysql的bin-log日志,插入的时候先往日志里写入记录,再完成实际的数据操作,如果出现宕机可以读取Journaling日志进行修复。
(6)支持多种语言,包括RUBY,PYTHON,JAVA,C++,PHP等
(1)MongoDB可以解决传统数据库不好解决的三高问题 High performance - 对数据库高并发读写的需求 Huge
Storage - 对海量数据的高效率存储和访问的需求 High Scalability && High Availability-
对数据库的高可扩展性和高可用性的需求 (2)MongoDB应用场景特点 数据量大; 读写操作频繁; 不需要复杂的事务和join操作;
数据价值较低,对事务要求不高 (3)常见实际应用场景 ①游戏场景
使用MongoDB存储游戏用户信息、装备、积分等,直接以内嵌文档的形式存储,方便查询、更新。 ②物流场景
使用MongoDB存储订单信息、订单状态、物流信息,订单状态在运送过程中飞速迭代、以MongoDB内嵌数组的形式来存储,一次查询就能将订单所有的变更查出来。
③社交场景 使用MongoDB存储用户信息,朋友圈信息,通过地理位置索引实现附近的人、定位功能。 ④物联网场景
使用MongoDB存储设备信息、设备汇报的日志信息、并对这些信息进行多维度分析。 ⑤视频直播 使用MongoDB存储用户信息、点赞互动信息。
⑥大数据应用 使用云数据库MongoDB作为大数据的云存储系统,随时进行数据提取分析,掌握行业动态。
(1)与关系型数据库(RDBMS)类比:
MongoDB概念 | RDBMS概念 |
---|---|
数据库 | 数据库 |
集合 | 表 |
文档 | 行 |
字段 | 列 |
索引 | 索引 |
id | 主键 |
视图 | 视图 |
聚合操作 | 表连接 |
(2)基本概念介绍
数据库(database):最外层的概念,可以理解为逻辑上的名称空间,一个数据库包含多个不同名称的集合。
集合(collection):相当于SQL中的表,一个集合可以存放多个不同的文档。
文档(document):一个文档相当于数据表中的一行,由多个不同的字段组成。
字段(field):文档中的一个属性,等同于列(column)。 索引(index):独立的检索式数据结构,与SQL概念一致。
id:每个文档中都拥有一个唯一的id字段,相当于SQL中的主键(primary key)。
视图(view):可以看作一种虚拟的(非真实存在的)集合,与SQL中的视图类似。从MongoDB3.4版本开始提供了视图功能,其通过聚合管道技术实现。
聚合操作(lookup):MongoDB用于实现“类似”表连接(tablejoin)的聚合操作符。
进入下载地址,选择windows版本的进行下载即可。我这里下载的是6.0.4版本。
下载完成直接下一步下一步安装即可,最好不要修改安装位置,会默认装上可视化工具MongoDB Conpass。
控制台输入services.msc,查看MongoDB的服务,正常启动则安装成功。
(1)连接数据库
默认端口27017
(2)新建数据库Database和集合Collection
这里的集合相当于传统数据库的表名
(3)添加数据
我这里随便找了个json的数据,补充在_id后面,注意不要漏了逗号,否则会提示格式不对
(4)导出数据
可以导出json或者csv格式的数据,output那里需要指定一个文件进行导出
(5)添加索引
选择索引时会提示有哪些字段可以选
索引类型可以选择升序asc,降序desc,地理空间索引2dsphere,全文索引text
(6)其他功能
[Aggregation]选项卡即是聚合函数信息区,用于实现“类似”表连接操作;
[Schema]选项卡即是模式信息区,点击分析按钮可以看到当前集合(表)的执行信息,如表数据导入时间,表的具体字段、长度等信息;
[Explain Plan]选项卡即是执行计划信息区,可评估查询性能; [Validation]
选项卡可以用于验证数据,可以添加规则验证数据质量注:增删改查语法参照下面navicat
(1)连接数据库
新建连接时选择数据库类型为MongoDB即可,默认端口27017
Ⅰ、新增
1)语法:
db. 集合名 .insert( 文档 ) : 往集合中插入一个文档
db. 集合名 .find(): 查询集合中所有文档
db.users.insertMany:批量插入
2)示例:
①插入一个用户对象
db.user.insert({
name: "刘备",
age:"24"
})
当没有设置id时,mangoDB会自动生成一个id。
往集合中新增文档,当集合不存在时会自动先创建集合,再往集合中添加文档。
②插入一个用户对象(设置id,设置数据类型)
db.user.insert({id: NumberLong(1), name: "赵日地", age: NumberInt(18)})
③批量插入
db.users.insertMany(
[
{
_id: 1,
name: "sue",
age: 19,
type: 1,
status: "P",
favorites: { artist: "Picasso", food: "pizza" },
finished: [ 17, 3 ],
badges: [ "blue", "black" ],
points: [
{ points: 85, bonus: 20 },
{ points: 85, bonus: 10 }
]
},
{
_id: 2,
name: "bob",
age: 42,
type: 1,
status: "A",
favorites: { artist: "Miro", food: "meringue" },
finished: [ 11, 25 ],
badges: [ "green" ],
points: [
{ points: 85, bonus: 20 },
{ points: 64, bonus: 12 }
]
},
{
_id: 3,
name: "ahn",
age: 22,
type: 2,
status: "A",
favorites: { artist: "Cassatt", food: "cake" },
finished: [ 6 ],
badges: [ "blue", "red" ],
points: [
{ points: 81, bonus: 8 },
{ points: 55, bonus: 20 }
]
},
{
_id: 4,
name: "xi",
age: 34,
type: 2,
status: "D",
favorites: { artist: "Chagall", food: "chocolate" },
finished: [ 5, 11 ],
badges: [ "red", "black" ],
points: [
{ points: 53, bonus: 15 },
{ points: 51, bonus: 15 }
]
},
{
_id: 5,
name: "xyz",
age: 23,
type: 2,
status: "D",
favorites: { artist: "Noguchi", food: "nougat" },
finished: [ 14, 6 ],
badges: [ "orange" ],
points: [
{ points: 71, bonus: 20 }
]
},
{
_id: 6,
name: "abc",
age: 43,
type: 1,
status: "A",
favorites: { food: "pizza", artist: "Picasso" },
finished: [ 18, 12 ],
badges: [ "black", "blue" ],
points: [
{ points: 78, bonus: 8 },
{ points: 57, bonus: 7 }
]
}
]
)
Ⅱ、删除
1)语法
删除 1 个,若有多个则删除第一个: db. 集合名 .deleteOne( … )
删除所有: db. 集合名 .deleteMany( … )
2)示例
①删除第一个 status=A的文档
db.users.deleteOne({ status: "A" })
②删除所有带有 name=abc 的文档
db.users.deleteMany({ name : "abc" })
③删除当前数据库中所有文档
db.users.deleteMany({})
Ⅲ、更新
1)语法:
更新1个:db.集合名.updateOne( … )
更新所有:db.集合名.updateMany( … )
2)示例:
①把一个带有 name=xyz 的文档,修改其 age 值为 30
db.users.updateOne({name: "xyz"}, {$set: {age: 30}})
②修改所有 name=xyz的文档,修改其name=“zyx” , age=20
db.users.updateMany({name: "xyz"} ,{$set: {name: "zyx", age: 20}})
Ⅳ、普通查询
1)语法
db. 集合名 .find(query , projection)
2)示例
①查询所有文档
db.users.find()
Ⅴ、高级查询
1)等值
语法 -> find({ 字段 : 值 })
2)比较查询
语法 -> find({ 字段 : { 比较操作符 : 值, …}})
如:db.users.find({age:{$gt:20}})
比较操作符:
(>) 大于 - $gt
(<) 小于 - $lt
(>=) 大于等于 - $gte
(<= ) 小于等于 - $lte
(!=) 不等 - $ne
集合运算 - KaTeX parse error: Expected '}', got 'EOF' at end of input: in 如:`{name: {in: [“xiaoyao”,“bunny”]}} 判断存在 - $exists 如:
{name: {$exists:true}}`
3)逻辑查询
语法 -> find({逻辑操作符: [条件1, 条件2, …]})
逻辑操作符:
(&&) 与 - $and
(||) 或 - $or
(!) 非 - $not
包含但不包含: $nor
存在: e x i s t s 基于类型查询: exists 基于类型查询: exists基于类型查询:type
如:db.users.find({$and:[{age:{$gt:20}},{status:"A"}]})
4)模糊查询
MongoDB的模糊查询使用的是正则表达式的语法 如:{name: {$regex: /^.*keyword.*$/}}
Ⅰ.mongodb6.0后无默认shell工具(之前的版本是mongo.exe),需要下载,下载后将mongosh.exe、mongosh_crypt_v1.dll放入bin目录下 。下载地址
Ⅱ.打开mongosh.exe,按enter即可进入。
Ⅲ.执行下面命令
切换数据库:
use admin
创建用户,这里root是角色名
db.createUser({
user: 'admin', // 用户名
pwd: '123456', // 密码
roles:[{
role: 'root', // 角色
db: 'admin' // 数据库
}]
})
如果需要在admin数据库以外的数据库新建数据库test,可以给角色赋读写权限
db.grantRolesToUser("admin",[{ role: "readWrite", db: "test" }])
查看角色是否创建成功:
show users
下一次创建角色需要登录赋权
db.auth("admin","123456");
Ⅳ.修改配置文件
默认安装目录:C:\Program Files\MongoDB\Server\6.0\bin\mongod.cfg
找到#security: 处,添加
security:
authorization: enabled
Ⅴ.重新启动,再试试不需要用户密码登录连接mongo,失败。再试试下面的连接是否成功。
Ⅵ.连接成功后可以在查看中显示隐藏的项目,否则admin的数据库是默认隐藏的。
添加maven包
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-mongodbartifactId>
<version>3.0.2version>
dependency>
application.yml配置
spring:
data:
mongodb:
uri: mongodb://admin:123456@localhost:27017/admin
新建User类
package com.example.user.domain;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.data.annotation.Id;
import java.util.Date;
@Data
@AllArgsConstructor
public class User {
@Id
private String userId;
private String name;
private Integer age;
private Date createTime = new Date();
}
UserRepository.java:
注意这里泛型的User对应的Collections(表),String代表主键类型。通过Web应用新增时会自动创建表。
package com.example.user.dal;
import com.example.user.domain.User;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends MongoRepository<User, String> {
}
UserController.java:
package com.example.user.controller;
import com.example.user.dal.UserRepository;
import com.example.user.domain.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@Controller
public class UserController {
@RequestMapping(value = "/test")
@ResponseBody
public String test() {
return "test111";
}
@Autowired
private final UserRepository userRepository;
public UserController(UserRepository userRepository) {
this.userRepository = userRepository;
}
@PostMapping("/addUser")
@ResponseBody
public String addNewUser(@RequestBody User user) {
userRepository.save(user);
return "添加成功!";
}
@GetMapping("/getUserList")
@ResponseBody
public String getUserList() {
List<User> userList = userRepository.findAll();
userList.forEach(user -> System.out.println(user.toString()));
return "";
}
}