专栏首页eclipse编程MongoDB:我知道你很爱我

MongoDB:我知道你很爱我

什么要使用 MongoDB

1. 张三大学毕业设计题目是《XXX博客论坛》,他在存储用户评论的时候遇到了一个问题:这些评论数据量非常大,但是价值不是很大,如果存储在 MySQL 数据库中就会浪费性能。

2. 李四在工作过程中遇到一个需求:在审批模块中,每一个公司都可以自定义请假类型,例如调休、出差等。相当于给每个公司维护一个自己的数据字典。

张三的痛点是存储的博客评论数据量大但是价值不大,不适合使用Mysql存储。李四的痛点是需要维护一个数据字典,不适合用关系型数据局。为了解决张三和李四的痛点,这个时候非关系型文档型数据库 MongoDB 闪亮登场。

MongoDB 介绍

1. 什么是 MongoDB

MongoDB是一个跨平台的,面向文档的数据库,是当前NoSQL数据库产品中最热门的一种。它介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富,最像关系数据库的产品。

2. MongoDB 特点

MongoDB 最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。它是一个面向集合的,模式自由的文档型数据库。具体特点总结如下: (1)面向集合存储,易于存储对象类型的数据 (2)模式自由 (3)支持动态查询 (4)支持完全索引,包含内部对象 (5)支持复制和故障恢复 (6)使用高效的二进制数据存储,包括大型对象(如视频等) (7)支持 Python,Java,C,Javascript,Perl及 C++ 语言的驱动程序 (9)文件存储格式为 BSON(一种 JSON 的扩展)

3. MongoDB 结构

MongoDB 的逻辑结构是一种层次结构。主要由:文档 (document)、集合(collection)、数据库 (database) 这三部分组成的。 (1)MongoDB 的文档,相当于关系数据库中的一行记录。 (2)多个文档组成一个集合,集合相当于关系数据库的表。 (3)多个集合逻辑上组织在一起,就是数据库。

4. MongoDB 与 MySQL 数据库逻辑结构概念的对比

MongoDB

MySQl

数据库(database)

数据库(database)

集合(Collection)

表(table)

文档(document)

行(row)

主键,MongoDB默认将_id设为主键

主键

索引

索引

5.MongoDB 层次结构如下图

安装 MongoDB

1. Docker安装MongoDB

启动MongoDB服务

   docker run -itd --name mongo -p 27017:27017 mongo --auth

注: 1. 如果是购买的服务器,请将安全组的27017端口打开。 2. -p 27017:27017 :容器服务的 27017 端口映射到服务器的27017端口。外部可以直接通过服务器 ip:27017 访问到 mongodb 的服务。 --auth:需要密码才能访问。

2. 创建账户

##进入到容器内部
docker exec -it mongo mongo admin
##创建系统管理员
db.createUser({ user:'admin',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},"readWriteAnyDatabase"]});
##验证账户密码
db.auth('admin', '123456')

##创建其他数据库
use ems
##在该数据库下创建其他账户
db.createUser({ user: 'root', pwd: 'abc123456', roles: [ { role: "readWrite", db:"ems" } ] });
##验证账户密码
db.auth('root', 'abc123456')

3. Navicat 客户端连接 MongoDB

创建数据库

SpringBoot 整合 MongoDB

1. 添加依赖

<!-- MongoDB-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>        
</dependency>

2. 修改 SpringBoot 配置文件

spring:
  data:
    mongodb:
      uri: mongodb://root:123456@localhost:27017/test

账户:root 密码:123456 数据库:test

3. 创建实体类

import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

/**
 * 常用收款人
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@Document(collection = "common_account")
public class CommonAccount {
    @Id
    private String id;
    //公司id
    private Integer companyId;
    //付款人
    private String payer;
    //银行
    private String bank;
    //分支行
    private String bankBranch;
    //账号
    private String bankNum;
}
 

关键注解: 1. @Document(collection = "common_account") @Document表示这是一个集合,当你保存数据的时候如果你没有创建集合,他会自动给你创建一个名为 common_account 的集合。 2. @Id:随机生成id

4. 创建 Repository

@Repository
public interface CommonAccountRepository extends MongoRepository<CommonAccount, String> {

    //获取该公司的所有常用收款人账户
    List<CommonAccount> getByCompanyId(Integer companyId);

}

extends MongoRepository:通过继承 MongoRepository 可以使用它很多常用的方法。

5. 创建 Service

public interface CommonAccountService {

    //获取该公司的收款账户
    List<CommonAccount> getCommonAccount(Integer companyId);

    //添加收款账户
    void addCommonAccount(CommonAccount commonAccount);

    //更新收款账户
    void updateCommonAccount(CommonAccount commonAccount);

    //删除收款账户
    void deleteCommonAccount(String id);

}

6. Service 实现类

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class CommonAccountServiceImpl implements CommonAccountService {

    @Autowired
    private CommonAccountRepository commonAccountRepository;
    @Autowired
    private MongoTemplate mongoTemplate;

    @Override
    public List<CommonAccount> getCommonAccount(Integer companyId) {
        List<CommonAccount> accountList = commonAccountRepository.getByCompanyId(companyId);
        return accountList;
    }

    @Override
    public void addCommonAccount(CommonAccount commonAccount) {
        commonAccountRepository.save(commonAccount);
    }

    @Override
    public void updateCommonAccount(CommonAccount commonAccount) {
        Query query = Query.query(Criteria.where("id").is(commonAccount.getId()));
        Update update = new Update();
        update.set("companyId", commonAccount.getCompanyId());
        update.set("payer", commonAccount.getPayer());
        update.set("bank", commonAccount.getBank());
        update.set("bankBranch", commonAccount.getBankBranch());
        update.set("bankNum", commonAccount.getBankNum());
        mongoTemplate.updateFirst(query, update, CommonAccount.class);
    }

    @Override
    public void deleteCommonAccount(String id) {
        commonAccountRepository.deleteById(id);
    }
}

7. 去除 _class 列

mongoDB 保存数据的时候默认会新增一个 _class 列,如下图:

添加如下配置,去除_class 列

@Configuration
public class MongoConfig {

    /**
     * 去掉_class
     * @param factory
     * @param context
     * @param beanFactory
     * @return
     */
    @Bean
    public MappingMongoConverter mappingMongoConverter(MongoDatabaseFactory factory, MongoMappingContext context, BeanFactory beanFactory) {
        DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory);
        MappingMongoConverter mappingConverter = new MappingMongoConverter(dbRefResolver, context);
        try {
            mappingConverter.setCustomConversions(beanFactory.getBean(MongoCustomConversions.class));
        } catch (NoSuchBeanDefinitionException ignore) {
        }

        mappingConverter.setTypeMapper(new DefaultMongoTypeMapper(null));

        return mappingConverter;
    }
}

8. 测试

    @Test
    void mongoTest() {
        CommonAccount commonAccount = new CommonAccount();
        commonAccount.setPayer("张三").setBank("交通银行").setBankBranch("北京路分行")
                .setBankNum("61262663265362").setCompanyId(100);
        commonAccountService.addCommonAccount(commonAccount);
    }

-END-

本文分享自微信公众号 - eclipse编程(eclipsecamp),作者:一颗雷布斯

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-02-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 我知道你不知道GB2312

    这篇文章将是大猫《如何搞定头疼的编码》一文的一部分,当时本来想做一个完整的有关“R与编码”的笔记,没想到后来洋洋洒洒写了六七千字,估计一时半会也完成不了,所以先...

    用户7652506
  • MongoDB,我的道

    但是事实说明了一切。这个用户的MongoDB集群从2015年上线以来,到2020年的今天,已经运行了5年时间。承载了每天的数据汇聚和数据同步(到检索服务),平均...

    MongoDB中文社区
  • 我不知道你知不知道我知道的伪元素小技巧

    伪元素能做什么?我们要他有何用?它能为我们解决什么问题?和其他的方法相比她有什么有点?我们为什么要使用它?

    sunseekers
  • 别对我说谎!你的小九九我都知道

    著名的美剧Lie to me《千谎百计》相信不少听友都看过,说的是一位很厉害的心理学家能够通过人在说话时,零点零零几秒的瞬间表情,判断出这个是否在说谎。 ? 该...

    企鹅号小编
  • TED演讲 | 我知道统计学很重要,但是关我什么事?

    大数据文摘
  • MONGODB Sharding Key 你怎么对我,我怎么对你

    上期说了说搭建MongoDB Sharding 的问题,分片好搭建,其实大部分失败的MongoDB 分片的问题在于分片键选错了。

    AustinDatabases
  • 『JVM』我不想知道我是怎么来滴,我就想知道我是怎么没滴

    所谓的 JVM 崩溃,一般情况下就是指内存溢出,也就是 OutOfMemoryError 和 StackOverflowError。另外还有一种情况就是堆外内存...

    古时的风筝
  • 我恨区块链,你知道为啥吗?

    上世纪80年代-90年代,随着互联网基础设施的完善和先行者们对于网络社区的早期探索,一个基于电子世界的“新边疆”开始展露头条,对于这片未经开发的处女地,人们充满...

    区块链大本营
  • Linux我就想知道你用了多少

    看上面使用了du --max-depth=1 -h的命令来查找磁盘的使用情况,因为后面没有跟路径,它就默认是当前的路径。这个命令的-h参数是为了方便你读懂每个文...

    DataScience
  • 你问我爱你有多深,源码代表我的心

    Rainbond开源
  • 我走过十年,来爱你

    ? 当新鲜感变为经典款, 你还会选择继续爱TA吗? 七夕之际 云煮鸡想对你们说上一世情话: “曾经沧海难为水,除却CVM不是云” “玲珑骰子安云盘,入骨相思知...

    腾讯云计算产品团队
  • 我不知道你知不知道但前端NEXT知道的伪元素小技巧

    腾讯NEXT学位
  • 当我开始使用React 时,我希望我知道这些知识

    自2013年5月29日首次发布以来,React.js已经占领了互联网。我和许多其他开发人员将他们的成功归功于这个了不起的框架,这已经不是什么秘密了。

    前端小智@大迁世界
  • 专栏:013:我要你知道实时票房.

    谢伟
  • 你的口头禅,别问我怎么知道!

    苏南
  • 你的口头禅,别问我怎么知道!

    @超人
  • 我猜你不知道FactoryBean是什么东西

    BeanFactory定义了IOC容器的最基本形式,并提供了IOC容器应遵守的的最基本的接口,也就是Spring IOC所遵守的最底层和最基本的编程规范。在Sp...

    DH镔
  • MongoDB 入门,我是花了心思的

    有时候不得不感慨一下,系统升级真的是好处多多,不仅让我有机会重构了之前的烂代码,也满足了我积极好学的虚荣心。你看,Redis 入门了、Elasticsearch...

    沉默王二
  • 你知道多少this,new,bind,call,apply?那我告诉你

    那么什么是this,new,bind,call,apply呢?这些你都用过吗?掌握这些内容都是基础中的基础了。如果你不了解,那还不赶快去复习复习,上网查阅资料啥...

    达达前端

扫码关注云+社区

领取腾讯云代金券