MongoDB
简介
MongoDB 是一种开源的、面向文档的、非关系型数据库管理系统(NoSQL),由C++语言编写
它设计用于处理大量分布式数据,特别适用于现代应用程序中的大数据存储和高流量场景
MongoDB 最初发布于2009年,迅速成为NoSQL数据库领域中最受欢迎的解决方案之一
核心特点
- 面向集合存储:数据被组织在集合(Collection)中,而非表格。每个集合可以存储不同类型和结构的文档,这使得MongoDB非常适合存储复杂或不断变化的数据结构。
- 模式自由(Schema-less):与传统关系数据库不同,MongoDB不需要预先定义数据结构。文档(Document)可以有不同的字段和结构,这提供了极大的灵活性。
- JSON样式的文档:文档以BSON(Binary JSON)格式存储,这是一种二进制编码的数据格式,效率高且能存储丰富的数据类型,包括嵌套文档和数组。
- 动态查询:支持强大的查询语言,包括地理空间查询、文本搜索等,查询语法接近于面向对象的查询。
- 完全索引:支持对任何属性建立索引,包括内嵌文档和数组的元素,从而提升查询性能。
- 复制与自动故障恢复:通过副本集(Replica Set)实现数据的自动复制和故障切换,确保高可用性。
- 水平扩展性:利用分片(Sharding)技术可以水平扩展存储和处理能力,适应数据量和负载的快速增长。
- 多种语言支持:提供丰富的驱动程序,支持Ruby、Python、Java、C++、PHP、C#等多种编程语言,便于集成到各种应用中。
- 云友好:自动处理碎片,支持云计算环境下的弹性扩展,并且与各大云服务商有良好的集成。
应用场景
- 内容管理系统:存储文章、评论、用户资料等多样化的内容。
- 实时数据分析:处理和分析来自物联网设备、社交媒体等的实时数据流。
- 移动与Web应用:作为用户数据、会话信息、内容存储的后端数据库。
- 电子商务:管理库存、订单、用户行为数据等。
- 游戏开发:存储玩家信息、游戏状态、排行榜等数据。
下载
https://www.mongodb.com/try/download/community
教程
https://www.runoob.com/mongodb/mongodb-window-install.html
基础入门:http://doc.javaex.cn/mongodb
Docker
搜索镜像
1
docker search mongo
下载镜像
1
docker pull mongo
运行
1
docker run --name mongodb -p 27017:27017 -d mongo --auth
查看运行情况
1
docker ps
进入 mongodb
1
docker exec -it ${containerid} mongo admin
当前 db 版本
1
db.version();
创建一个 admin 管理员账号并授权
1
2
3
4# 账号 admin 密码 admin
# 角色 userAdminAnyDatabase
# 数据库 admin
db.createUser({ user: 'admin', pwd: 'admin', roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] });创建普通用户
1
2
3
4# 账号 wangwenzhe 密码 123456
# 角色 readWrite
# 数据库 cms
db.createUser({ user: 'wangwenzhe', pwd: '123456', roles: [ { role: "readWrite", db: "cms" } ] });授权
1
2
3
4# 给账号 admin 授权
# 角色 __system
# 数据库 admin
db.grantRolesToUser ( "admin", [ { role: "__system", db: "admin" } ] )登录用户
1
db.auth("admin","admin");
添加数据
1
2
3
4
5
6
7
8# 切换到 test 数据库,不存在就创建
use test
#向 test 表中添加数据
db.test.save({name:"王文哲"});
# 查询 user 集合数据
db.test.find()
常用命令
https://zhuanlan.zhihu.com/p/101297478
数据库操作
查询所有库
1
show dbs;
创建或切换数据库
1
use dbname;
删除数据库
1
db.dropDatabase();
获取当前数据库名称
1
db.getName();
获取数据库状态
1
db.stats();
查看当前 db 的链接机器地址
1
db.getMongo();
从指定主机上克隆数据库
1
db.cloneDatabase("127.0.0.1");
从指定的机器上复制指定数据库数据到某个数据库
1
2# 源数据库、目标数据库、源 IP
db.copyDatabase("yhb", "test1", "127.0.0.1");修复数据库
1
db.repairDatabase();
集合操作
查看集合状态
1
db.people.stats();
获取指定集合
1
db.getCollection("human");
获取当前 db 中的所有集合
1
db.getCollectionNames();
用户操作
添加用户
1
db.createUser({user:"zs",pwd:"111",roles:["read"]})
数据库认证、安全模式
1
db.auth(“zs”, “111”);
删除用户
1
db.removeUser("zs");
数据操作
添加
1 | db.people.save({name: 'zhangsan', age: 18, sex: true}); |
修改
1 | db.people.update({age: 18}, {$set: {name: 'changeName'}}, false, true); |
删除
1 | db.people.remove({age: 12}); |
查询
查询所有记录
1
db.people.find();
查询后根据某列去重
1
db.people.distinct("name");
索引
创建索引
1
2
3db.people.ensureIndex({name: 1});
db.people.ensureIndex ({name: 1, ts: -1}); // 联合索引
db.people.ensureIndex ({"name":1},{"unique":true}); // 唯一索引删除索引
1
2
3
4
5# 删除指定索引
db.people.dropIndex("name_1");
# 删除所有索引索引
db.people.dropIndexes();
SpringBoot 中使用
https://www.cnblogs.com/ityouknow/p/6828919.html
包括:多数据源 MongoDB 的使用
maven
1
2
3
4<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>application.yml
1
2
3
4
5
6spring:
application:
name: spring-boot-mongodb
data:
mongodb:
uri: mongodb://admin:admin@127.0.0.1:27017/admin # uri格式:mongodb://name:password@ip:port/db实体对象
1
2
3
4
5
6
7
8public class User implements Serializable {
private static final long serialVersionUID = -3258839839160856613L;
private Long id;
private String userName;
private String passWord;
//getter、setter省略
}增删改查
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
public class UserRepositoryImpl implements UserRepository {
private MongoTemplate mongoTemplate;
/**
* 创建对象
* @param user
*/
public void saveUser(User user) {
mongoTemplate.save(user);
}
/**
* 根据用户名查询对象
* @param userName
* @return
*/
public User findUserByUserName(String userName) {
Query query=new Query(Criteria.where("userName").is(userName));
User user = mongoTemplate.findOne(query , User.class);
return user;
}
/**
* 更新对象
* @param user
*/
public long updateUser(User user) {
Query query=new Query(Criteria.where("id").is(user.getId()));
Update update= new Update().set("userName", user.getUserName()).set("passWord", user.getPassWord());
//更新查询返回结果集的第一条
UpdateResult result =mongoTemplate.updateFirst(query,update,User.class);
//更新查询返回结果集的所有
// mongoTemplate.updateMulti(query,update,UserEntity.class);
if(result!=null)
return result.getMatchedCount();
else
return 0;
}
/**
* 删除对象
* @param id
*/
public void deleteUserById(Long id) {
Query query=new Query(Criteria.where("id").is(id));
mongoTemplate.remove(query,User.class);
}
}
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 王文哲的博客!