MongoDB-1入门介绍

2023-09-13 15:52:00

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")
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);

优化手段

索引

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之前,
否则无法得到正确的结果。

使用数据分片

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

使用副本集

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

定期删除不再使用的数据

更多推荐

亚马逊,沃尔玛,速卖通卖家如何实现高效且安全的测评补单

对于卖家而言,测评资源确实是一项宝贵的财富。通过自养号和广告相结合的策略,可以快速有效地提升产品销量、增加转化率以及提高Listing的权重。这是一个很好的方法来优化产品在平台上的表现现在很多卖家都选择自己养号下单,自己做测评1.可根据需求,一单,两单,三单自由组合下单,不用每天花时间浏览养号,缩短做成成品号时间2.不

Vue3快速上手

1.Vue3简介2020年9月18日,Vue.js发布3.0版本,代号:OnePiece(海贼王)耗时2年多、2600+次提交、30+个RFC、600+次PR、99位贡献者github上的tags地址:Releasev3.0.0OnePiece·vuejs/core·GitHub2.Vue3带来了什么1.性能的提升打包

3、从“人等机器”到“人机和谐”

1、前言2、从“键鼠套装”到“全键盘游戏化”审核显著影响审核效率的另一个因素是卡顿,初期引起卡顿的主要原因是网络不畅。待审内容来自生产系统,公司的生产系统是部署在公网的,审核人员需要通过公司办公网的出口,从公网获取视频进行审核,堵车情况时有发生,不仅抢占了公司办公网的出口带宽,招致其他部门的抱怨,也影响审核工作的效率。

Redis相关知识

2、Redis提供了哪几种持久化方式?RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储。AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾.Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于

Linux:基础开发工具之yum,vim,gcc的使用

文章目录yumvimgcc本篇主要总结的是Linux下开发工具yumvimgcc/g++yum什么是yum?不管是在手机移动端还是pc端,不管是什么操作系统,当用户想要下载一些内容或者工具的时候,都需要到一个特定的位置进行下载,例如在手机上,要下载一些应用的时候就可以去对应的应用商店下载而在Linux系统中也有这样的概

虚拟机如何扩容麒麟操作系统的根文件系统

在工作中,经常会面临服务器磁盘空间不足的问题,特别是根文件系统(/)快满了。本文将介绍如何扩容Linux服务器的根文件系统,以解决这个常见的问题。步骤一:关机后扩容磁盘步骤二:打开磁盘实用工具(主要就是把空闲磁盘挂载命令行的话网上教程很多这里不赘述了我偷懒了hh)将空闲区域创建分区(效果如上图)步骤三:检查磁盘空间首先

jdk17新特性

JDK17新特性jdk17下载地址:https://download.oracle.com/java/17/latest/jdk-17_windows-x64_bin.exeJDK17文档-首页(oracle.com)垃圾回收器(ZGarbageCollector)概述JDK17引入名为ZGC(ZGarbageColl

【2023,学点儿新Java-02】计算机硬件与软件 | CPU、内存、硬盘概览 | 科学使用键盘——“指法” | 软件——计算机的灵魂 | 人机交互方式

前情回顾:【2023,学点儿新Java-01】从查看本机jdk版本开始|Java基础全程脉络图、Java工程师全程技术路线、Java职业晋升路线图我们见到的太阳是八分钟前的太阳,见到的月亮是一点三秒之前的月亮,见到一英里之外的建筑,是五微秒之前存在的,即使你在我一米之外,我见到的也是三纳米秒以前的你,我们所眼见的都是过

华为云云耀云服务器L实例评测|基于L实例使用Docker部署MySQL服务并连接MySQL—phpMyAdmin管理工具

文章目录一、云耀云服务器产品优势1、智能不卡顿2、价优随心用3、上手更简单4、管理更省心二、远程连接云耀云服务器L实例三、安装Docker、docker-compse1、docker安装2、docker-compose安装四、方法①使用Docker安装部署MySQL服务五、方法②使用docker-compse安装部署M

ELK 企业级日志分析系统

ELK概述:1、ELK简介ELK平台是一套完整的日志集中处理解决方案,将ElasticSearch、Logstash和Kiabana三个开源工具配合使用,完成更强大的用户对日志的查询、排序、统计需求。●ElasticSearch:是基于Lucene(一个全文检索引擎的架构)开发的分布式存储检索引擎,用来存储各类日志。E

免杀对抗-Python-混淆算法+反序列化-打包生成器-Pyinstall

Python-MSF/CS生成shellcode-上线cs上线1.生成shellcode-c或者python2.打开pycharm工具,创建一个py文件,将原生态执行代码复制进去shellcode执行代码:importctypesfromdjango.contrib.gisimportptr#cs#shellcode=

热文推荐