非关系型数据库MongoDB(文档型数据库)介绍与使用实例 ...

打印 上一主题 下一主题

主题 850|帖子 850|积分 2550


MongoDB介绍

        MongoDB是一种开源的文档型数据库管理系统,它使用类似于JSON的BSON格式(Binary JSON)来存储数据。与传统关系型数据库差别,MongoDB不使用表和行的结构,而是采用集合(Collection)(Mysql表)和文档(Document)(MySql行)的概念来组织数据。


  • MongoDB是一个基于分布式文件存储的数据库
  • 由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储办理方案。
  • MongoDB是一个介于关系数据库和非关系数据库之间的产物,是非关系数据库当中功能最丰富,最像关系数据库的。
  • 它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比力复杂的数据类型
  • Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据创建索引
MongoDB的重要特点包罗:
1. 强大的灵活性:MongoDB的文档模型答应存储差别结构的数据,使用者可以轻松地添加、修改和删除字段,而无需举行复杂的模式迁移。
2. 高性能:MongoDB支持程度扩展,可以实现高并发和大规模的数据处置惩罚。它还提供了索引和查询优化等功能,以提高读取和写入的性能。
3. 高可用性:MongoDB支持主从复制和分片的特性,可以实现数据的备份和故障恢复。当主节点出现故障时,系统可以主动切换为备用节点来提供服务。
4. 丰富的查询语言:MongoDB使用类似于SQL的查询语言来举行数据的查询和聚合操纵。同时,它还提供了地理空间查询和全文索引等功能,以满意各种复杂的查询需求。
使用场景

MongoDB是一种非关系型数据库,实用于很多差别的使用场景。以下是一些常见的
网站数据存储
           实时应用:MongoDB 非常得当需要频繁插入、更新和查询的实时应用程序,比如新闻feed、博客、论坛、批评系统等,其快速的写入速度和高效的查询性能有利于应对高并发访问。
  游戏开发
           游戏用户信息:存储玩家账户、角色属性、装备、积分等数据,内嵌文档结构能很好地满意这类复杂且动态变化的数据需求。
          实时数据分析:游戏事件日志、实时排行榜等场景要求数据库具备快速写入和即时查询的能力。
  物流与电商
           订单管理:订单信息、商品库存、生意业务汗青等,MongoDB 对频繁更新的状态跟踪体现良好。
          用户行为分析:记载并分析用户欣赏、购买、搜索等行为数据。
  交际网络
           用户资料与交际关系:存储用户个人信息、好友列表、消息记载等半结构化数据。
          地理位置服务:使用地理空间索引轻松实现附近的用户、地点查找功能。
  物联网(IoT)
           装备数据存储:网络来自各种智能装备的实时或周期性上报的数据,如温度、湿度、状态变化等信息。
          日志记载与分析:处置惩罚大量的装备日志数据,举行多维度分析和实时监控。
  内容管理系统
           博客文章、多媒体内容存储:支持大文本、富媒体类型的内容存储,同时方便实现内容标签、分类等关联查询。
  视频直播和流媒体
           用户运动记载:存储用户观看汗青、互动行为(如送礼、弹幕)等信息。
          实时统计与计费:对用户运动数据举行实时统计和计费计算。
  缓存系统
           高性能缓存:作为高速缓存层,存储常常访问但不需永世保存或可以容忍短时间丢失的数据。
  大数据分析
           聚合框架:MongoDB 内置了强大的聚合管道功能,可以在数据库层面完成数据预处置惩罚和开端分析。
   关键名词

在 MongoDB 中有三个比力重要的名词:数据库集合文档

数据库 (Database)
        在 MongoDB 中,数据库是最顶层的逻辑容器,它包罗一组集合(collections)。每个 MongoDB 实例可以包罗多个数据库,而且数据库之间相互独立,互不影响。
集合 (Collection)
        集合类似于关系型数据库中的表,它是 MongoDB 中存储文档的容器。集合中的文档不需要预先界说 schema(模式),也就是说,同一个集合中的文档可以有差别的字段结构。每个集合中的文档都有唯一的 _id 字段作为主键标识符。比方,users 或 orders 都可以是集合名,它们分别存储用户信息或订单数据。
文档 (Document)
        文档是 MongoDB 中的根本数据单元,它对应于关系型数据库中的行。文档是以 BSON(Binary JSON)格式存储的数据结构,类似于 JSON 对象,支持嵌套结构和数组。每个文档包罗多个键值对,键为字符串,值可以是各种数据类型,包罗其他文档、数组和其他复杂结构。比方,一个用户文档大概如下所示:

MongoDB 使用 

引用依赖包
  1.         <dependency>
  2.             <groupId>org.springframework.boot</groupId>
  3.             <artifactId>spring-boot-starter-data-mongodb</artifactId>
  4.         </dependency>
复制代码
配置文件配置mongodb资料(.property文件)
  1. # MongoDB连接信息
  2. spring.data.mongodb.host = 192.168.23.27
  3. spring.data.mongodb.port = 27017
  4. spring.data.mongodb.database = mall
  5. spring.data.mongodb.auto-index-creation = true
复制代码
准备对象Person
  1. @Document(collection = "person") // 指定集合名称,就是类似mysql的表,如果不指定就以类名称作为集合名称
  2. @Data
  3. public class Person {
  4.     @Id // 文档id, 很重要,类似mysql表的主键
  5.     private Long id;
  6.     private String name;
  7.     private Integer age;
  8.     /**
  9.      * 创建一个10秒之后文档自动删除的索引 结合 spring.data.mongodb.auto-index-creation = true 一起使用
  10.        创建一个10秒之后文档自动删除, 类似 redis ttl
  11. 注意:这个字段必须是date类型或者是一个包含date类型值的数组字段,一般我们使用date类型;
  12.      */
  13.     @Indexed(expireAfterSeconds=10)
  14.     private LocalDateTime createTime;
  15. }
复制代码

新增文档 

  1. @Autowired
  2.     private MongoTemplate mongoTemplate;
  3.     /**
  4.      * 插入文档
  5.      */
  6.     @Test
  7.     void insert() {
  8.         Person person =new Person();
  9.         person.setId(20530712L);
  10.         person.setName("张三");
  11.         person.setAge(26);
  12.         mongoTemplate.insert(person);
  13.     }
  14.     /**
  15.      * 自定义集合,插入文档
  16.      */
  17.     @Test
  18.     public void insertCustomCollection() throws Exception {
  19.         Person person =new Person();
  20.         person.setId(20530712L);
  21.         person.setName("张三");
  22.         person.setAge(26);
  23.         person.setCreateTime(LocalDateTimeUtil.now());
  24.         mongoTemplate.insert(person, "custom_person");
  25.     }
  26.     /**
  27.      * 批量插入文档
  28.      */
  29.     @Test
  30.     public void insertBatch() throws Exception {
  31.         List<Person> personList = new ArrayList<>();
  32.         for (int i = 1; i < 5; i++) {
  33.             Person person =new Person();
  34.             person.setId((long) i);
  35.             person.setName("张三"+i);
  36.             person.setAge(26);
  37.             person.setCreateTime(LocalDateTimeUtil.now());
  38.             personList.add(person);
  39.         }
  40.        //mongoTemplate.insert(personList, "custom_person");
  41.         mongoTemplate.insertAll(personList);
  42.     }
  43.     /**
  44.      * 存储文档,如果没有插入,否则更新
  45.      * 在存储文档的时候会通过主键 ID 进行判断,如果存在就更新,否则就插入
  46.      */
  47.     @Test
  48.     public void save() throws Exception {
  49.         Person person =new Person();
  50.         person.setId(1L);
  51.         person.setName("张三33");
  52.         person.setAge(26);
  53.         person.setCreateTime(LocalDateTimeUtil.now());
  54.         mongoTemplate.save(person);
  55.     }
复制代码
修改文档

  1. @Autowired
  2.     private MongoTemplate mongoTemplate;
  3.     /**
  4.      * 更新文档,匹配查询到的文档数据中的第一条数据
  5.      * @throws Exception
  6.      */
  7.     @Test
  8.     public void update1() throws Exception {
  9.      
  10.         //更新条件
  11.         Query query= new Query(Criteria.where("id").is(2));
  12.         //更新值
  13.         Update update= new Update().set("name", person.getName()).set("age", 32);
  14.         //更新查询满足条件的文档数据(第一条)
  15.         UpdateResult result =mongoTemplate.updateFirst(query, update, Person.class);
  16.         System.out.println("更新条数:" + result.getMatchedCount());
  17.     }
  18.     /**
  19.      * 更新文档,匹配查询到的文档数据中的所有数据
  20.      */
  21.     @Test
  22.     public void updateMany() throws Exception {
  23.         //更新年龄大于等于32的人
  24.         Query query= new Query(Criteria.where("age").gte(18));
  25.         //更新姓名为 “我成人了”
  26.         Update update= new Update().set("name", "我成人了");
  27.         //更新查询满足条件的文档数据(全部)
  28.         UpdateResult result = mongoTemplate.updateMulti(query, update, Person.class);
  29.         System.out.println("更新条数:" + result.getMatchedCount());
  30.     }
复制代码
删除文档

  1. @Autowired
  2.     private MongoTemplate mongoTemplate;
  3.     /**
  4.      * 删除符合条件的所有文档
  5.      */
  6.     @Test
  7.     public void remove() throws Exception {
  8.       //删除年龄小于18的所有人
  9.         Query query = new Query(Criteria.where("age").lt(18));
  10.         DeleteResult result = mongoTemplate.remove(query, Person.class);
  11.         System.out.println("删除条数:" + result.getDeletedCount());
  12.     }
  13.     /**
  14.      * 删除符合条件的单个文档,并返回删除的文档
  15.      */
  16.     @Test
  17.     public void findAndRemove() throws Exception {
  18.         Query query = new Query(Criteria.where("id").is(1L));
  19.         Person result = mongoTemplate.findAndRemove(query, Person.class);
  20.         System.out.println("删除的文档数据:" + result);
  21.     }
  22.     /**
  23.      * 删除符合条件的所有文档,并返回删除的文档
  24.      */
  25.     @Test
  26.     public void findAllAndRemove() throws Exception {
  27.         // 使用 in 删除 符合条件的多条文档,并返回
  28.         Query query = new Query(Criteria.where("id").in(1,2,3));
  29.         List<Person> result = mongoTemplate.findAllAndRemove(query, Person.class);
  30.         System.out.println("删除的文档数据:" + result.toString());
  31.     }
复制代码
查询文档

原生查询

  1. db.getCollection("my_person").find({ name: /^张/ ,name: /大$/})
  2. db.getCollection("my_person").find({ name: /^张/,age:{$lte:12}})
复制代码
Java实现


  1. @Autowired
  2.     private MongoTemplate mongoTemplate;
  3.     /**
  4.      * 查询集合中的全部文档数据
  5.      */
  6.     @Test
  7.     public void findAll()  {
  8.         List<Person> result = mongoTemplate.findAll(Person.class);
  9.         System.out.println("查询结果:" + result.toString());
  10.     }
  11.     /**
  12.      * 查询集合中指定的ID文档数据
  13.      */
  14.     @Test
  15.     public void findById() {
  16.         long id = 2L;
  17.         Person result = mongoTemplate.findById(id, Person.class);
  18.         System.out.println("查询结果:" + result.toString());
  19.     }
  20.     /**
  21.      * 根据条件查询集合中符合条件的文档,返回第一条数据
  22.      */
  23.     @Test
  24.     public void findOne() {
  25.         Query query = new Query(Criteria.where("name").is("张三3"));
  26.         Person result = mongoTemplate.findOne(query, Person.class);
  27.         System.out.println("查询结果:" + result.toString());
  28.     }
  29.     /**
  30.      * 根据条件查询所有符合条件的文档
  31.      */
  32.     @Test
  33.     public void findByCondition() {
  34.         Query query = new Query(Criteria.where("age").gt(18));
  35.         List<Person> result = mongoTemplate.find(query, Person.class);
  36.         System.out.println("查询结果:" + result.toString());
  37.     }
  38.     /**
  39.      * 根据【AND】关联多个查询条件,查询集合中所有符合条件的文档数据
  40.      */
  41.     @Test
  42.     public void findByAndCondition() {
  43.         // 创建条件
  44.         Criteria name = Criteria.where("name").is("张三");
  45.         Criteria age = Criteria.where("age").is(18);
  46.         // 创建条件对象,将上面条件进行 AND 关联
  47.         Criteria criteria = new Criteria().andOperator(name, age);
  48.         // 创建查询对象,然后将条件对象添加到其中
  49.         Query query = new Query(criteria);
  50.         List<Person> result = mongoTemplate.find(query, Person.class);
  51.         System.out.println("查询结果:" + result.toString());
  52.     }
  53.     /**
  54.      * 根据【OR】关联多个查询条件,查询集合中的文档数据
  55.      */
  56.     @Test
  57.     public void findByOrCondition() {
  58.         // 创建条件
  59.         Criteria criteriaUserName = Criteria.where("name").is("张三");
  60.         Criteria criteriaPassWord = Criteria.where("age").is(22);
  61.         // 创建条件对象,将上面条件进行 OR 关联
  62.         Criteria criteria = new Criteria().orOperator(criteriaUserName, criteriaPassWord);
  63.         // 创建查询对象,然后将条件对象添加到其中
  64.         Query query = new Query(criteria);
  65.         List<Person> result = mongoTemplate.find(query, Person.class);
  66.         System.out.println("查询结果:" + result.toString());
  67.     }
  68.     /**
  69.      * 根据【IN】关联多个查询条件,查询集合中的文档数据
  70.      */
  71.     @Test
  72.     public void findByInCondition() {
  73.         // 设置查询条件参数
  74.         List<Long> ids = Arrays.asList(10L, 11L, 12L);
  75.         // 创建条件
  76.         Criteria criteria = Criteria.where("id").in(ids);
  77.         // 创建查询对象,然后将条件对象添加到其中
  78.         Query query = new Query(criteria);
  79.         List<Person> result = mongoTemplate.find(query, Person.class);
  80.         System.out.println("查询结果:" + result.toString());
  81.     }
  82.     /**
  83.      * 根据【逻辑运算符】查询集合中的文档数据
  84.      */
  85.     @Test
  86.     public void findByOperator() {
  87.         // 设置查询条件参数
  88.         int min = 20;
  89.         int max = 35;
  90.         Criteria criteria = Criteria.where("age").gt(min).lte(max);
  91.         // 创建查询对象,然后将条件对象添加到其中
  92.         Query query = new Query(criteria);
  93.         List<Person> result = mongoTemplate.find(query, Person.class);
  94.         System.out.println("查询结果:" + result.toString());
  95.     }
  96.     /**
  97.      * 根据【正则表达式】查询集合中的文档数据
  98.      */
  99.     @Test
  100.     public void findByRegex() {
  101.         // 设置查询条件参数
  102.         String regex = "^张";
  103.         Criteria criteria = Criteria.where("name").regex(regex);
  104.         // 创建查询对象,然后将条件对象添加到其中
  105.         Query query = new Query(criteria);
  106.         List<Person> result = mongoTemplate.find(query, Person.class);
  107.         System.out.println("查询结果:" + result.toString());
  108.     }
  109.     /**
  110.      * 根据条件查询集合中符合条件的文档,获取其文档列表并排序
  111.      */
  112.     @Test
  113.     public void findByConditionAndSort() {
  114.         Query query = new Query(Criteria.where("name").is("张三")).with(Sort.by("age"));
  115.         List<Person> result = mongoTemplate.find(query, Person.class);
  116.         System.out.println("查询结果:" + result.toString());
  117.     }
  118.     /**
  119.      * 根据单个条件查询集合中的文档数据,并按指定字段进行排序与限制指定数目
  120.      */
  121.     @Test
  122.     public void findByConditionAndSortLimit() {
  123.         String userName = "张三";
  124.         //从第5行开始,查询3条数据返回
  125.         Query query = new Query(Criteria.where("name").is("张三"))
  126.                 .with(Sort.by("createTime"))
  127.                 .limit(3).skip(5);
  128.         List<Person> result = mongoTemplate.find(query, Person.class);
  129.         System.out.println("查询结果:" + result.toString());
  130.     }
  131.     /**
  132.      * 统计集合中符合【查询条件】的文档【数量】
  133.      */
  134.     @Test
  135.     public void countNumber() {
  136.         // 设置查询条件参数
  137.         String regex = "^张*";
  138.         Criteria criteria = Criteria.where("name").regex(regex);
  139.         // 创建查询对象,然后将条件对象添加到其中
  140.         Query query = new Query(criteria);
  141.         long count = mongoTemplate.count(query, Person.class);
  142.         System.out.println("统计结果:" + count);
  143.     }
复制代码
创建索引

  1. @Autowired
  2.     private MongoTemplate mongoTemplate;
  3.     /**
  4.      * 创建升序索引
  5.      */
  6.     @Test
  7.     public void createAscendingIndex() {
  8.         // 设置字段名称
  9.         String field = "age";
  10.         // 创建索引
  11.         mongoTemplate.getCollection("person").createIndex(Indexes.descending(field));
  12.     }
  13.     /**
  14.      * 根据索引名称移除索引
  15.      */
  16.     @Test
  17.     public void removeIndex() {
  18.         // 设置字段名称
  19.         String field = "age_1";
  20.         // 删除索引
  21.         mongoTemplate.getCollection("person").dropIndex(field);
  22.     }
  23.     /**
  24.      * 查询集合中所有的索引
  25.      */
  26.     @Test
  27.     public void getIndexAll() {
  28.         // 获取集合中所有列表
  29.         ListIndexesIterable<Document> indexList =   mongoTemplate.getCollection("person").listIndexes();
  30.         // 获取集合中全部索引信息
  31.         for (Document document : indexList) {
  32.             System.out.println("索引列表:" + document);
  33.         }
  34.     }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

立聪堂德州十三局店

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表