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")
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树索引。【Mysql Innodb引擎使用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支持副本集,可以提高数据的可用性和性能。例如,可以将读操作分发到副本集中的从节点上,以减轻主节点的负载。

定期删除不再使用的数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/134577.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

性能测试知多少---性能分析与调优的原理

最近一直纠结性能分析与调优如何下手&#xff0c;先从硬件开始&#xff0c;还是先从代码或数据库。从操作系统&#xff08;CPU调度&#xff0c;内存管理&#xff0c;进程调度&#xff0c;磁盘I/O&#xff09;、网络、协议&#xff08;HTTP&#xff0c; TCP/IP &#xff09;&…

webpack:css-loader和style-loader关系

测试 当我们webpack 的 rules 啥都没配置的时候 const path require(path);module.exports {entry: ./src/index.js,output: {filename: index.js,path: path.resolve(__dirname, dist)},module: {rules: []} };我们在 js 中导入了 css&#xff0c;发现报错&#xff0c;因为…

软件测试的基础知识

目录 前言 软件测试的生命周期 如何描述一个bug 如何定位bug的级别 bug的生命周期 和开发人员产生争执怎么办 设计一个测试用例 前言 上篇文章主要写了软件测试的一些基本概念以及软件测试的前置知识,这篇文章主要带大家了解在进行软件测试之前要准备的工作. 软件测试…

Trino HTTPS 与密码认证介绍与实战操作

文章目录 一、概述二、安装 Trino三、配置 HTTPS1&#xff09;生成证书2&#xff09;配置 Trino3&#xff09;修改 Trino docker-compose yaml 文件4&#xff09;开始部署 Trino5&#xff09;测试验证 四、密码认证1&#xff09;开启密码认证2&#xff09;创建密码认证配置文件…

编辑器的缩略图实现原理

一、背景 部分 Web 版的 IDE 编辑器未曾实现缩略图功能&#xff0c;探寻一下缩略图的实现逻辑。以 VSCode 为例。 VSCode 的编辑器是monaco实现的&#xff0c;编辑器的编辑区都是采用的虚拟渲染&#xff0c;即仅渲染可视区的代码&#xff0c;可视区之外的动态去除 DOM 节点。…

SpringBoot结合MyBatis实现多数据源配置

SpringBoot结合MyBatis实现多数据源配置 一、前提条件 1.1、环境准备 SpringBoot框架实现多数据源操作&#xff0c;首先需要搭建Mybatis的运行环境。 由于是多数据源&#xff0c;也就是要有多个数据库&#xff0c;所以&#xff0c;我们创建两个测试数据库&#xff0c;分别是…

6. 装饰器

UML 聚合(Aggregation)关系&#xff1a;大雁和雁群&#xff0c;上图中空心菱形箭头表示聚合关系组合(Composition)关系&#xff1a;大雁和翅膀 &#xff0c;实心菱形箭头表示组合(Composition)关系 测试代码 #include <iostream> #include <stdio.h> #include &l…

R 语言的安装教程

一、下载相关软件 1、R 下载 官网&#xff1a;R: The R Project for Statistical Computing 找到中国镜像&#xff0c;下载快 历史版本点击这里 2、Rtools 下载 进入镜像后&#xff0c;点击这里 然后选择与上面下载的R版本相对应的版本即可 3、Rstudio 下载 官网&#xff1…

Spring 篇

1、什么是 Spring&#xff1f; Spring是一个轻量级的IOC和AOP容器框架。是为Java应用程序提供基础性服务的一套框架&#xff0c;目的是用于简化企业应用程序的开发&#xff0c;它使得开发者只需要关心业务需求。常见的配置方式有三种&#xff1a;基于XML的配置、基于注解的配置…

Prometheus+Grafana可视化监控【Nginx状态】

文章目录 一、安装Docker二、安装Nginx(Docker容器方式)三、安装Prometheus四、安装Grafana五、Pronetheus和Grafana相关联六、安装nginx_exporter七、Grafana添加Nginx监控模板 一、安装Docker 注意&#xff1a;我这里使用之前写好脚本进行安装Docker&#xff0c;如果已经有D…

排查disabled问题之谷歌新版本特性

问题复现 最近我突然接手一个后台的bug&#xff0c;这个后台很久没有迭代更新了&#xff0c;我也不熟悉业务&#xff0c;所以只能看一下源码&#xff0c;问题很快就复现&#xff0c;测试的修复操作也很正确&#xff0c;就是因为渲染的input标签中存在disableddisabled’属性导…

Swing程序设计详解(一)

【今日】 “若你决定灿烂&#xff0c;山无遮&#xff0c;海无拦” 目录 初识Swing 一 Swing简述 二 Swing常用窗体 2.1 JFrame窗体 2.2 JDialog对话框 2.3JOptionPane小型对话框 (1)通知框 (2)确认框 (3)输入框 (4)自定义对话框 三 常用布局管理器 3.1 绝…

计算机组成与设计硬软件接口学习2

并行处理器&#xff1a;从客户端到云 任务级并行或进程级并行&#xff1a;通过同时运行独立的多个程序来使用多处理器 并行处理程序&#xff1a;同时在多个处理器上运行的单个程序 向量和标量 向量指令的重要属性&#xff1a; 单个向量指令指定了大量工作--相当于执行了完…

代码随想录训练营第四十八天|198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III

198.打家劫舍 力扣题目链接(opens new window) 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系…

基于PyTorch使用LSTM实现新闻文本分类任务

本文参考 PyTorch深度学习项目实战100例 https://weibaohang.blog.csdn.net/article/details/127154284?spm1001.2014.3001.5501 文章目录 本文参考任务介绍做数据的导入 环境介绍导入必要的包介绍torchnet和keras做数据的导入给必要的参数命名加载文本数据数据前处理模型训…

Android高级开发-APK极致优化

九道工序 1. SVG(Scalable Vector Graphics)可缩放矢量图 使用矢量图代替位图可以减小 APK 的尺寸&#xff0c;因为可以针对不同屏幕密度调整同一文件的大小&#xff0c;而不会降低图像质量。 矢量图首次加载时可能消耗更多的 CPU 资源。之后&#xff0c;二者的内存使用率和…

Java集合之LinedList

LinedList类实现了List接口&#xff0c;他提供了&#xff08;双向的&#xff09;链表数据结构 在该链表中的每一个元素除了存储本身的内容之外还存储指向前一个元素的指针和指向后一个元素的指针&#xff0c;下图展示了一个包含三个元素的双向链表&#xff0c;每个链表都有一个…

jeesite实现excel导入功能(保姆级图文教程)

文章目录 前言一、准备工作1.准备一个excel模板,放入static目录2.application.yml文件中设置文件存储路径3.使用easyexcel插件解析excel数据,pom文件导入easyexcel二、使用步骤1.列表页添加下载模板按钮2.表单页添加文件上传3. 创建excel解析对应实体4.后台完成文件上传代码,…

深入探索智能问答:从检索到生成的技术之旅

目录 一、智能问答概述1. **语义理解**2. **知识库和数据库**3. **上下文感知**4. **动态学习和自适应** 二、发展历程1. **基于规则的系统**2. **统计方法的兴起**3. **深度学习和神经网络的突破**4. **预训练模型** 三、智能问答系统的主要类型四、基于知识库的问答系统五、基…

机器视觉之Basler工业相机使用和配置方法(C++)

basler工业相机做双目视觉用&#xff0c;出现很多问题记录一下&#xff1a; 首先是多看手册&#xff1a;https://zh.docs.baslerweb.com/software 手册内有所有的源码和参考示例&#xff0c;实际上在使用过程中&#xff0c;大部分都是这些源码&#xff0c;具体项目选择对应的…