MongoDB

MongoDB

MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。

在高负载的情况下,添加更多的节点,可以保证服务器性能。

MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。

MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

Mongo是一种NoSql数据库,:

1.对数据库高并发读写。

2、对海量数据的高效率存储和访问。

3、对数据库的高可扩展性和高可用性

官方文档

使用场景

适用场景

1、网站数据:Mongo非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。

2、缓存:由于性能很高,Mongo也适合作为信息基础设施的缓存层。在系统重启之后,由M ongo搭建的持久化缓存层可以避免下层的数据源过载。

3、大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵, 在此之前,很多时候程序员往往会选择传统的文件进行存储。

4、高伸缩性的场景:Mongo非常适合由数十或数百台服务器组成的数据库。Mongo的路线图中已经包含对Map Reduce弓摩的内置支持。

5、用于对象及 JSON数据的存储:Mongo的BSON数据格式非常适合文档化格式的存储 及查询。

不适用场合

1、高度事务性的系统:例如银行或会计系统。传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用程序。

2、传统的商业智能应用:针对特定问题的BI数据库会对产生高度优化的查询方式。对于此类应用,数据仓库可能是更合适的选择。

安装

windows

  1. 下载mongodb

    • 官网下载 选择msi
    • 进入引导界面,选择Custom自定义安装路径
    • 之后会默认让安装compass可视化工具,可以不下载之后下第三方的
    • 一路next
  2. 安装为服务

    • 通过msi下载的mongdb会自动生成data和log目录

    • 还会在bin目录下自动生成mongod.cfg配置文件,里面写了data和log目录的位置

    • 进入bin目录,执行以下代码,将mongodb注册为服务

      1
      2
      # 报错可能是没有用管理员权限,或者mongod.cfg要输入全路径名
      mongod --config mongod.cfg --install --serviceName "MongoDB" --journal
    • 服务相关命令(管理员身份运行)

      1
      2
      3
      启动服务:net start MongoDB
      关闭服务:net stop MongoDB
      移除服务(bin目录下):mongod.exe --remove
  3. 下载可视化工具

    Download Studio 3T for MongoDB | Windows, macOS & Linux

    • 下载完解压,再安装
    • 测试连接localhost:27017

通过docker安装

  • 拉取镜像

    1
    docker pull mongo:latest
  • 创建和启动容器

    1
    docker run -d --restart=always -p 27017:27017 --name mymongo -v /data/db:/data/db -d mongo
  • 测试

    1
    2
    3
    4
    5
    6
    # 进入容器
    docker exec -it mymongo /bin/bash
    # 使用mongoDB客户端进行操作
    mongo
    # 查询所有数据库
    show dbs

概念

SQL术语/概念 MongoDB术语/概念 解释/说明
database database 数据库
table collection 数据库表/集合
row document 数据记录行/文档
column field 数据字段/域
index index 索引
table joins 表连接,MongoDB不支持
primary key primary key 主键,MongoDB自动将_id字段设置为主键

常用命令

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
# 在mongoDB客户端下进行操作

1、 Help查看命令提示
db.help();

2、 切换/创建数据库
use test
如果数据库不存在,则创建数据库,否则切换到指定数据库

3、 查询所有数据库
show dbs;

4、 删除当前使用数据库
db.dropDatabase();

5、 查看当前使用的数据库
db.getName();

6、 显示当前db状态
db.stats();

7、 当前db版本
db.version();

8、 查看当前db的链接机器地址
db.getMongo();

集合

对应关系型数据库中的表

1
2
3
4
1、 创建一个集合(table)
db.createCollection("collName");
2、 得到指定名称的集合(table )
db.getCollection("user");

记录

对应关系型数据库中的字段

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
# 插入数据 
# db.集合名.方法
db.User.insertOne({name:'zhangsan',age:21,sex:true})

# 查询数据
# 查询所有
db.User.find()
# 条件查询
db.User.find({name:'zs'})
db.User.find({_id: ObjectId('658bcb39e98bb66dcf831af9')}) # 根据_id查要加个ObjectId()
# 指定字段,后面的{}中0表示该列返回空,1表示返回该列的值,不写的列不会返回
db.User.find({age: 21}, {_id: 0, name: 1,age: 1});
# 排序,1表示正序,-1表示逆序
db.User.find().sort({age:1})
# 分页查询
db.User.find().skip(0).limit(3)


# 更新数据
# 更新单条数据
# 第一个参数为条件,第二个参数为操作
db.testCollection.updateOne({_id: ObjectId("658bcb39e98bb66dcf831af9")}, {$set: {age: 26}})
db.testCollection.updateOne(
{ name: "Alice" }, // 更新条件
{ $inc: { age: 1 } } // 对age字段进行增量更新
)
db.testCollection.updateOne(
{ name: "Bob" }, // 更新条件
{ $push: { hobbies: "hiking" } } // 向hobbies数组字段中添加"hiking"元素
)
# 更新所有符合条件的数据
db.testCollection.updateMany({sex: true}, {$set: {sex: false}})

# 删除数据
# 删除单条
db.testCollection.deleteOne({ name: "Alice" })
# 删除所有符合条件的
db.testCollection.deleteMany({ age: { $lt: 30 } })

# 索引
# 创建索引
db.testCollection.createIndex({age: 1}, {name: 'age_idx'})
# 查看所有索引
db.testCollection.getIndexes()
# 删除索引
db.testCollection.dropIndex("age_idx")

SpringBoot 整合MongoDB

spring-data-mongodb提供了MongoTemplate与MongoRepository两种方式访问mongodb,MongoRepository操作简单,MongoTemplate操作灵活,可以灵活适用这两种方式操作mongodb,MongoRepository的缺点是不够灵活,MongoTemplate正好可以弥补不足。

常用注解

注解 说明
@Document 标示映射到Mongodb文档上的领域对象
@Id 将相应字段设置为主键
@Indexed 标示某个字段为Mongodb的索引字段,提高该字段的检索速度
@Query 可以用Mongodb的JSON查询语句进行查询

操作

MongoTemplate
  • 导入依赖

    1
    2
    3
    4
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>
  • 添加配置

    1
    2
    3
    4
    5
    spring:
    data:
    # 连接地址 端口号 连接的数据库
    mongodb:
    uri: mongodb://127.0.0.1:27017/mall-port
  • 添加实体类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @Data
    @Document("User") //对应MongoDb中的表名
    public class User {

    @Id
    private String id;
    private String name;
    private Integer age;
    private String email;
    private String createDate;
    }
  • 测试使用

    插入、查询

    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    @SpringBootTest
    class DemoMongoDBApplicationTest {

    @Autowired
    private MongoTemplate mongoTemplate;

    // insert 插入数据
    @Test
    public void create() {
    User user = new User();
    user.setAge(20);
    user.setName("test");
    user.setEmail("111@qq.com");
    User user1 = mongoTemplate.insert(user);
    System.out.println(user1);
    }

    // findAll 查询所有数据
    @Test
    public void findAll() {
    List<User> all = mongoTemplate.findAll(User.class);
    System.out.println(all);
    }

    // findById 通过id查询
    @Test
    public void findById() {
    User user = mongoTemplate.findById("634c047f1bda8149e63ff1ee", User.class);
    System.out.println(user);
    }

    // 条件查询
    @Test
    public void findUserList() {
    // 构建条件
    Query query = new Query(Criteria
    .where("name").is("test")
    .and("age").is(20));
    List<User> userList = mongoTemplate.find(query, User.class);
    System.out.println(userList);
    }

    // 模糊条件查询
    @Test
    public void findLikeUserList() {

    // 构建正则
    String name = "est";
    String regex = String.format("%s%s%s", ".*", name, "*$");
    Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
    // 构建条件
    Query query = new Query(Criteria
    .where("name").regex(pattern));
    List<User> userList = mongoTemplate.find(query, User.class);
    System.out.println(userList);
    }

    // 分页查询
    @Test
    public void findPageUserList() {
    int current = 1;
    int size = 3;
    // 构建正则
    String name = "est";
    String regex = String.format("%s%s%s", ".*", name, "*$");
    Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
    // 构建条件
    Query query = new Query(Criteria
    .where("name").regex(pattern));

    // 分页构建
    long count = mongoTemplate.count(query, User.class); //记录数
    // skip(当前页的开始下标).limit(查询页数)
    List<User> userList = mongoTemplate.find(query.skip((current - 1) * size).limit(size), User.class);
    System.out.println("总记录数:" + count);
    System.out.println(userList);
    }
    }

    修改、删除

    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
    // 修改
    @Test
    public void updateUser() {
    User user = mongoTemplate.findById("634c047f1bda8149e63ff1ee", User.class);
    user.setName("asdasdasd");

    Query query = new Query(Criteria.where("_id").is(user.getId()));
    Update update = new Update();
    update.set("name", user.getName());
    update.set("age", user.getAge());
    update.set("email", user.getEmail());

    // 通过查询条件查询出数据,更新的属性
    UpdateResult upsert = mongoTemplate.upsert(query, update, User.class);
    // 改变的条数
    long modifiedCount = upsert.getModifiedCount();
    System.out.println(modifiedCount);
    }

    // 删除
    @Test
    public void deleteUser() {
    Query query = new Query(Criteria.where("_id").is("634c047f1bda8149e63ff1ee"));

    DeleteResult remove = mongoTemplate.remove(query, User.class);
    long deletedCount = remove.getDeletedCount();
    System.out.println(deletedCount);
    }
MongoRepository
  • 添加Repository类

    1
    2
    3
    @Repository
    public interface UserRepository extends MongoRepository<User, String> {
    }
  • CRUD

    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    @SpringBootTest
    class DemoMongoDBApplicationTest1 {

    @Autowired
    private UserRepository userRepository;

    // save 插入数据
    @Test
    public void create() {
    User user = new User();
    user.setAge(20);
    user.setName("张三");
    user.setEmail("3332200@qq.com");
    User user1 = userRepository.save(user);
    }

    // findAll 查询所有数据
    @Test
    public void findAll() {
    List<User> all = userRepository.findAll();
    System.out.println(all);
    }

    // findById 通过id查询
    @Test
    public void findById() {
    User user = userRepository.findById("634c06471bda8149e63ff1ef").get();
    System.out.println(user);
    }

    // 条件查询
    @Test
    public void findUserList() {
    // 构造查询条件
    User user = new User();
    user.setAge(20);
    Example<User> userExample = Example.of(user);

    List<User> users = userRepository.findAll(userExample);
    System.out.println(users);
    }

    // 模糊条件查询
    @Test
    public void findLikeUserList() {
    //创建匹配器,即如何使用查询条件
    ExampleMatcher matcher = ExampleMatcher.matching() //构建对象
    .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) //改变默认字符串匹配方式:模糊查询
    .withIgnoreCase(true); //改变默认大小写忽略方式:忽略大小写
    User user = new User();
    user.setName("三");
    Example<User> userExample = Example.of(user, matcher);
    List<User> userList = userRepository.findAll(userExample);
    System.out.println(userList);
    }

    // 分页查询
    @Test
    public void findPageUserList() {
    Pageable page = PageRequest.of(0, 3);

    Page<User> pages = userRepository.findAll(page);
    System.out.println(pages);
    }

    // 修改
    @Test
    public void updateUser() {
    User user = userRepository.findById("635fc9b4d74a3c02b054754a").get();
    user.setName("王五");
    userRepository.save(user); // 有相同id时为修改
    }

    // 删除
    @Test
    public void deleteUser() {
    userRepository.deleteById("635fc9b4d74a3c02b054754a");
    }
    }

实例

springBoot 版本2.7.8

  1. 导入坐标

    1
    2
    3
    4
    5
    <!--Spring Data MongoDB-->
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>
  2. 编写配置

    1
    2
    3
    4
    5
    spring:
    data:
    mongodb:
    # 连接地址 端口号 连接的数据库
    uri: mongodb://127.0.0.1:27017/mall-port
  3. 编写映射到mongodb的文档对象

    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
    /**
    * 用户商品浏览历史记录
    */
    @Data
    @Document
    public class MemberReadHistory {
    @Id
    private String id;

    @Indexed
    private Long memberId;

    private String memberNickname;

    private String memberIcon;

    @Indexed
    private Long productId;

    private String productName;

    private String productPic;

    private String productSubTitle;

    private String productPrice;

    private Date createTime;
    }
  4. 编写操作类

    1
    2
    3
    4
    @Repository
    public interface MemberReadHistoryRepository extends MongoRepository<MemberReadHistory, String> {
    List<MemberReadHistory> findBy MemberIdOrderByCreateTimeDesc(Long memberId);
    }
  5. 编写Service接口、实现接口

    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
    @Service
    public class MemberReadHistoryServiceImpl implements MemberReadHistoryService {
    @Resource
    private MemberReadHistoryRepository memberReadHistoryRepository;

    @Override
    public int create(MemberReadHistory memberReadHistory) {
    memberReadHistory.setId(null);
    memberReadHistory.setCreateTime(new Date());
    memberReadHistoryRepository.save(memberReadHistory);
    return 1;
    }

    @Override
    public int delete(List<String> ids) {
    List<MemberReadHistory> deleteList = new ArrayList<>();
    for(String id : ids){
    MemberReadHistory memberReadHistory = new MemberReadHistory();
    memberReadHistory.setId(id);
    deleteList.add(memberReadHistory);
    }
    memberReadHistoryRepository.deleteAll(deleteList);
    return ids.size();
    }

    @Override
    public List<MemberReadHistory> list(Long memberId) {
    return memberReadHistoryRepository.findByMemberIdOrderByCreateTimeDesc(memberId);
    }
    }
  6. 编写Controller

    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
    @Api(tags = "会员商品浏览记录管理")
    @RestController("/member/readHistory")
    public class MemberReadHistoryController {
    @Resource
    private MemberReadHistoryService memberReadHistoryService;

    @ApiOperation("创建浏览记录")
    @PostMapping("/create")
    public CommonResult create(@RequestBody MemberReadHistory memberReadHistory) {
    int count = memberReadHistoryService.create(memberReadHistory);
    if (count > 0) {
    return CommonResult.success(count);
    } else {
    return CommonResult.failed();
    }
    }

    @ApiOperation("删除浏览记录")
    @PostMapping(value = "/delete")
    public CommonResult delete(@RequestParam("ids") List<String> ids) {
    int count = memberReadHistoryService.delete(ids);
    if (count > 0) {
    return CommonResult.success(count);
    } else {
    return CommonResult.failed();
    }
    }

    @ApiOperation("展示浏览记录")
    @GetMapping(value = "/list")
    public CommonResult<List<MemberReadHistory>> list(Long memberId) {
    List<MemberReadHistory> memberReadHistoryList = memberReadHistoryService.list(memberId);
    return CommonResult.success(memberReadHistoryList);
    }
    }

  7. 测试


MongoDB
http://xwww12.github.io/2023/02/14/中间件/Mongodb/
作者
xw
发布于
2023年2月14日
许可协议