• MongoDB-1入门介绍


    NoSQL

    NoSQL(NoSQL = Not Only SQL),意即反SQL运动,指的是非关系型的数据库

    优点

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

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

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

    弱点:

    1、数据库事务一致性需求

    2、数据库的写实时性和读实时性需求

    3、对复杂的SQL查询,特别是多表关联查询的需求

    简介

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

    它支持的数据结构非常松散,数据格式是BSON,一种类似
    JSON的二进制形式的存储格式,简称Binary JSON ,和JSON一样支持内嵌的文档对象和
    数组对象,因此可以存储比较复杂的数据类型。

    Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的
    绝大部分功能,而且还支持对数据建立索引。
    原则上 Oracle 和 MySQL 能做的事情,MongoDB 都能做(包括 ACID 事务)。

    MongoDB术语与SQL术语对比

    在这里插入图片描述

    MongoDB与关系型数据库性能对比

    在这里插入图片描述

    特点

    半结构化

    在一个集合中,文档所拥有的字段并不需要是相同的,而且也不需要对所用的字段进行声明。因此,MongoDB具有很明显的半结构化特点。除了松散的表结构,文档还可以支持多级的嵌套、数组等灵活的数据类型,非常契合面向对象的编程模型。

    弱关系

    MongoDB没有外键的约束,也没有非常强大的表连接能力。类似的功能需要使用聚合管道技术来弥补

    支持海量数据、高可用

    复制集提供99.999%高可用
    分片架构支持海量数据和无缝扩容
    轻松支持TB-PB数量级

    应用场景

    游戏场景,使用 MongoDB 存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、更新;
    物流场景,使用 MongoDB 存储订单信息,订单状态在运送过程中会不断更新,以MongoDB 内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来;
    社交场景,使用 MongoDB 存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能;
    物联网场景,使用 MongoDB 存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析;
    视频直播,使用 MongoDB 存储用户信息、礼物信息等;
    大数据应用,使用云数据库MongoDB作为大数据的云存储系统,随时进行数据提取分析,掌握行业动态。|

    是否使用MongoDB判断

    只要有一项需求满足就可以考虑使用MongoDB,匹配越多,选择MongoDB越合适。
    在这里插入图片描述

    安装

    #拉取镜像
    docker pull mongo:latest

    #创建和启动容器
    docker run -d --restart=always -p 27017:27017 --name mymongo -v /data/db:/data/db -d mongo

    #进入容器
    docker exec -it mymongo/bin/bash

    #使用MongoDB客户端进行操作
    mongo

    show dbs #查询所有的数据库
    admin 0.000GB
    config 0.000GB
    local 0.000GB

    相关工具

    官方GUI工具——COMPASS

    MongoDB图形化管理工具(GUI),能够帮助您在不需要知道MongoDB查询语法的前提下,便利地分析和理解您的数据库模式,并且帮助您可视化地构建查询。
    下载地址:https://www.mongodb.com/zh-cn/products/compass
    在这里插入图片描述

    Mongo shell

    使用js

    load("books.js")
    
    • 1
    var tags = ["nosql","mongodb","document","developer","popular"];
    var types = ["technology","sociality","travel","novel","literature"];
    var books=[];
    for(var i=0;i<50;i++){
        var typeIdx = Math.floor(Math.random()*types.length);
        var tagIdx = Math.floor(Math.random()*tags.length);
        var favCount = Math.floor(Math.random()*100);
        var book = {
            title: "book-"+i,
            type: types[typeIdx],
            tag: tags[tagIdx],
            favCount: favCount,
            author: "xxx"+i
        };
        books.push(book)
    }
    db.books.insertMany(books);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    优化手段

    索引

    B+树索引。
    MongoDB支持多种索引类型,包括:

    单键索引(Single Key Index):只对一个字段进行索引。在MongoDB中,默认创建的_Id索引就是单键索引。
    复合索引(Compound Index):对多个字段进行索引。例如,如果经常需要根据两个或更多字段进行查询,那么创建复合索引可以提高查询效率。
    多键索引(Multikey Index):针对数组或嵌套文档的字段进行索引。多键索引会为数组的每个元素建立一条索引,允许在数组或嵌套文档字段上进行查询。
    地理空间索引(Geospatial Index):对包含地理坐标的字段进行索引,以支持地理位置相关的查询。
    文本索引(Text Index):对文本字段进行全文索引,以支持文本搜索和自然语言查询。

    使用聚合管道

    MongoDB支持聚合管道操作,可以将多个操作合并成一个操作,以减少网络通信和磁盘IO。例如,可以使用聚合管道来实现分页查询,将排序、投影和分页操作合并成一个操作。

    在MongoDB中,可以使用聚合管道来实现自定义条件搜索、排序、投影和分页。
    以下是一个示例:
    
    假设你有一个books集合,你希望根据某些条件搜索书籍,
    然后根据某个字段(例如rating)进行排序,只返回你感兴趣的字段,并将其分页。
    
    以下是具体的代码示例:
    
    javascript
    const mongoose = require('mongoose');  
    const Book = mongoose.model('Book', new mongoose.Schema({ name: String, rating: Number }));  
      
    // 定义搜索条件  
    const searchCondition = { name: /search keyword/ };  
      
    // 定义聚合管道  
    const pipeline = [];  
      
    // 添加匹配操作  
    pipeline.push({  
      $match: searchCondition  
    });  
      
    // 添加排序操作  
    pipeline.push({  
      $sort: { rating: -1 }  // 按 rating 字段降序排序  
    });  
      
    // 添加投影操作  
    pipeline.push({  
      $project: {  
        _id: 1,  // 包含 _id 字段  
        name: 1,  // 包含 name 字段  
        rating: 1  // 包含 rating 字段  
      }  
    });  
      
    // 添加分页操作  
    const skip = (page - 1) * limit;  // 计算跳过的数量  
    pipeline.push({  
      $skip: skip  
    });  
    pipeline.push({  
      $limit: limit  // 假设 limit 是每页的数量  
    });  
      
    // 执行聚合查询  
    Book.aggregate(pipeline, function(err, results) {  
      if (err) throw err;  
      console.log(results);  
    });
    在这个例子中,$match操作符用于满足自定义搜索条件,
    $sort操作符用于排序,$project操作符用于投影,$skip和$limit操作符用于分页。
    请注意,$skip和$limit的使用顺序很重要,因为$skip必须在$limit之前,
    否则无法得到正确的结果。
    
    • 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

    使用数据分片

    MongoDB支持数据分片,可以将数据分布到多个服务器上,以提高性能和可用性。例如,可以将用户数据按照地理位置进行分片,将用户数据分布到不同的服务器上,这样查询时就会更快

    使用副本集

    MongoDB支持副本集,可以提高数据的可用性和性能。例如,可以将读操作分发到副本集中的从节点上,以减轻主节点的负载。

    定期删除不再使用的数据

  • 相关阅读:
    【PAT甲级 - C++题解】1008 Elevator
    如何签署exe或Windows应用程序?
    中国石油大学(北京)-《油藏工程》第一阶段在线作业
    远程温控系统设计
    代码生成器实现
    【第97题】JAVA高级技术-网络编程16(简易聊天室11:实现客户端群聊)
    JAVA JDBC使用PreparedStatement实现CRUD操作
    T507修改分区方法-Linux、Android系统适用
    邀好友一起刷算法之合并两个有序链表
    python配置环境心得
  • 原文地址:https://blog.csdn.net/zzz19920821/article/details/132344855