简介

  • MongoDB 是一种开源的、面向文档的、非关系型数据库管理系统(NoSQL),由C++语言编写

  • 它设计用于处理大量分布式数据,特别适用于现代应用程序中的大数据存储和高流量场景

  • MongoDB 最初发布于2009年,迅速成为NoSQL数据库领域中最受欢迎的解决方案之一

核心特点

  1. 面向集合存储:数据被组织在集合(Collection)中,而非表格。每个集合可以存储不同类型和结构的文档,这使得MongoDB非常适合存储复杂或不断变化的数据结构。
  2. 模式自由(Schema-less):与传统关系数据库不同,MongoDB不需要预先定义数据结构。文档(Document)可以有不同的字段和结构,这提供了极大的灵活性。
  3. JSON样式的文档:文档以BSON(Binary JSON)格式存储,这是一种二进制编码的数据格式,效率高且能存储丰富的数据类型,包括嵌套文档和数组
  4. 动态查询:支持强大的查询语言,包括地理空间查询、文本搜索等,查询语法接近于面向对象的查询。
  5. 完全索引:支持对任何属性建立索引,包括内嵌文档和数组的元素,从而提升查询性能。
  6. 复制与自动故障恢复:通过副本集(Replica Set)实现数据的自动复制和故障切换,确保高可用性。
  7. 水平扩展性:利用分片(Sharding)技术可以水平扩展存储和处理能力,适应数据量和负载的快速增长。
  8. 多种语言支持:提供丰富的驱动程序,支持Ruby、Python、Java、C++、PHP、C#等多种编程语言,便于集成到各种应用中。
  9. 云友好:自动处理碎片,支持云计算环境下的弹性扩展,并且与各大云服务商有良好的集成。

应用场景

  • 内容管理系统:存储文章、评论、用户资料等多样化的内容。
  • 实时数据分析:处理和分析来自物联网设备、社交媒体等的实时数据流。
  • 移动与Web应用:作为用户数据、会话信息、内容存储的后端数据库。
  • 电子商务:管理库存、订单、用户行为数据等。
  • 游戏开发:存储玩家信息、游戏状态、排行榜等数据。

下载

https://www.mongodb.com/try/download/community

教程

https://www.runoob.com/mongodb/mongodb-window-install.html

基础入门:http://doc.javaex.cn/mongodb

Docker

  1. 搜索镜像

    1
    docker search mongo
  2. 下载镜像

    1
    docker pull mongo
  3. 运行

    1
    docker run --name mongodb -p 27017:27017 -d mongo --auth
  4. 查看运行情况

    1
    docker ps
  5. 进入 mongodb

    1
    docker exec -it ${containerid} mongo admin
  6. 当前 db 版本

    1
    db.version();
  7. 创建一个 admin 管理员账号并授权

    1
    2
    3
    4
    # 账号 admin 密码 admin 
    # 角色 userAdminAnyDatabase
    # 数据库 admin
    db.createUser({ user: 'admin', pwd: 'admin', roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] });
  8. 创建普通用户

    1
    2
    3
    4
    # 账号 wangwenzhe 密码 123456 
    # 角色 readWrite
    # 数据库 cms
    db.createUser({ user: 'wangwenzhe', pwd: '123456', roles: [ { role: "readWrite", db: "cms" } ] });
  9. 授权

    1
    2
    3
    4
    # 给账号 admin  授权
    # 角色 __system
    # 数据库 admin
    db.grantRolesToUser ( "admin", [ { role: "__system", db: "admin" } ] )
  10. 登录用户

    1
    db.auth("admin","admin");
  11. 添加数据

    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. 查询所有库

    1
    show dbs;
  2. 创建或切换数据库

    1
    use dbname;
  3. 删除数据库

    1
    db.dropDatabase();
  4. 获取当前数据库名称

    1
    db.getName();
  5. 获取数据库状态

    1
    db.stats();
  6. 查看当前 db 的链接机器地址

    1
    db.getMongo();
  7. 从指定主机上克隆数据库

    1
    db.cloneDatabase("127.0.0.1");
  8. 从指定的机器上复制指定数据库数据到某个数据库

    1
    2
    # 源数据库、目标数据库、源 IP
    db.copyDatabase("yhb", "test1", "127.0.0.1");
  9. 修复数据库

    1
    db.repairDatabase();

集合操作

  1. 查看集合状态

    1
    db.people.stats();
  2. 获取指定集合

    1
    db.getCollection("human");
  3. 获取当前 db 中的所有集合

    1
    db.getCollectionNames();

用户操作

  1. 添加用户

    1
    db.createUser({user:"zs",pwd:"111",roles:["read"]})
  2. 数据库认证、安全模式

    1
    db.auth(“zs”, “111”);
  3. 删除用户

    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. 查询所有记录

    1
    db.people.find();
  2. 查询后根据某列去重

    1
    db.people.distinct("name");

索引

  1. 创建索引

    1
    2
    3
    db.people.ensureIndex({name: 1});
    db.people.ensureIndex ({name: 1, ts: -1}); // 联合索引
    db.people.ensureIndex ({"name":1},{"unique":true}); // 唯一索引
  2. 删除索引

    1
    2
    3
    4
    5
    # 删除指定索引
    db.people.dropIndex("name_1");

    # 删除所有索引索引
    db.people.dropIndexes();

SpringBoot 中使用

https://www.cnblogs.com/ityouknow/p/6828919.html

包括:多数据源 MongoDB 的使用

  1. maven

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

    1
    2
    3
    4
    5
    6
    spring:
    application:
    name: spring-boot-mongodb
    data:
    mongodb:
    uri: mongodb://admin:admin@127.0.0.1:27017/admin # uri格式:mongodb://name:password@ip:port/db
  3. 实体对象

    1
    2
    3
    4
    5
    6
    7
    8
    public class User implements Serializable {
    private static final long serialVersionUID = -3258839839160856613L;
    private Long id;
    private String userName;
    private String passWord;

    //getter、setter省略
    }
  4. 增删改查

    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
    @Component
    public class UserRepositoryImpl implements UserRepository {

    @Autowired
    private MongoTemplate mongoTemplate;

    /**
    * 创建对象
    * @param user
    */
    @Override
    public void saveUser(User user) {
    mongoTemplate.save(user);
    }

    /**
    * 根据用户名查询对象
    * @param userName
    * @return
    */
    @Override
    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
    */
    @Override
    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
    */
    @Override
    public void deleteUserById(Long id) {
    Query query=new Query(Criteria.where("id").is(id));
    mongoTemplate.remove(query,User.class);
    }
    }