MongoDB基础入门

news2024/9/23 3:25:47

目录

【认识MongoDB】

MongoDB的使用场景

MongoDB的结构模型

【安装MongoDB】 

MacOS安装MongoDB

Windows安装MongoDB

客户端连接 


【认识MongoDB】

MongoDB是一个使用C++语言编写的基于分布式文件存储的数据库,是一个开源的、高性能、高扩展、无模式的文档型数据库,这里的文档指的是以JSON为数据模型的文档数据库。MongoDB设计的初衷就是为了简化开发和方便扩展,是NoSQL数据库产品中的一种,并且是最接近关系型数据库(如MySQL)的非关系型数据库。它支持的数据结构非常松散,使用类似于JSON的格式存储,既可以存储比较复杂的数据类型,又特别的灵活,没有了关系型数据库中字段的束缚。准确的说,MongoDB中记录的不是一个数据表(table),而是一个集合(collection)。而且MongoDB的横向扩展可以支撑很大的数据存储量和并发量。

MongoDB的使用场景

目前的互联网应用在数据操作中会有以下需求,也就是俗称的“三高”需求:

  • High performance - 对数据库高并发读写的需求。
  • Huge Storage - 对海量数据的高效率存储和访问的需求。
  • High Scalability && High Availability- 对数据库的高可扩展性和高可用性的需求。

MongoDB在某些应用场景下具有优势,比如:数据量大、读写操作都很频繁、对事务性要求不高。例如下面这些应用场景:

  • 电商场景:存储不同属性的商品信息,不同类别的商品拥有不同的属性,使用MongoDB的无固定字段的形式存储效率较高。
  • 社交场景:存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能。
  • 游戏场景:存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、高效率存储和访问。
  • 物流场景:存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB 内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来。
  • 物联网场景:存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析。
  • 视频直播:存储用户信息、点赞互动信息等。

具体来说,如果你的业务中出现了以下特点,就可以考虑使用MongoDB来存储数据:

  • 需求频繁变动,数据模型无法确定,想快速迭代开发;
  • 需要很高的读写QPS(比如QPS2000以上);
  • 需要TB甚至 PB 级别数据存储;
  • 发展迅速,需要能快速水平扩展;
  • 需要大量的地理位置查询、文本查询。

备注:这些场景并不是只能用MongoDB实现,使用传统的MySQL和Redis或者其他存储工具也能实现,只不过使用MongoDB会更加便捷和高效。MongoDB相比于MySQL的不足之处,就是不支持事务操作(MongoDB4.0之后已经可以支持事务(ACID)了,后面再细说);另外MongoDB也不支持join连表查询,但是可以使用内嵌文档的方式代替。

MongoDB的结构模型

上面说了MongoDB中没有“表”和“行”的概念,取而代之的是“集合”和“文档”。如下表格是对比MongoDB和MySQL的一些专有名词:

MySQLMongoDB
database 数据库database 数据库
table 表collection 集合
row 行document 文档
column 字段field 列
index 索引index 索引

一个MongoDB实例可以有多个数据库,不同的数据库存放在不同的文件中,这个和MySQL类似。MongoDB中默认会生成如下数据库:

  • admin 数据库:权限数据库,如果创建用户的时候将该用户添加到admin 数据库中,那么该用户就自动继承了所有数据库的权限。
  • config 数据库:当MongoDB 使用分片模式时,config数据库在内部使用,用于保存分片的信息。
  • local 数据库:这个数据库永远不会被复制,可以用来存储本地单台服务器的任意集合。

上面的工具是MongoDB Compass,是一个图形化界面操作MongoDB的可视化工具。 

MySQL的数据库中存储的是表,MongoDB的数据库中存储的是集合,集合就是一组文档,集合中的文档可以是各式各样的,例如,{“name”:“zhangsan”}和{“age”: 3},它们的键不同,值的类型也不同,但是它们可以存放在同一个集合中。在实际使用中,一般会将某一类有相关关系的文档存放在一个集合中。MongoDB并没有强制要求哪些文档放到哪些集合中,用户可以灵活选择。

MongoDB的最小存储单位就是文档(document)对象,数据在MongoDB中以BSON(Binary-JSON)的格式存储在磁盘上。一个文档的格式示例:

BSON(Binary Serialized Document Format)是一种类json的一种二进制形式的存储格式,简称Binary JSON。BSON和JSON一样,支持
内嵌的文档对象和数组对象,但是BSON有JSON没有的一些数据类型,如Date和BinData类型。
BSON采用了类似于 C 语言结构体的名称、对表示方法,支持内嵌的文档对象和数组对象,具有轻量性、可遍历性、高效性的三个特点,可
以有效描述非结构化数据和结构化数据。这种格式的优点是灵活性高,但它的缺点是空间利用率不是很理想。

文档中的值不仅可以是双引号中的字符串,也可以是其他的数据类型,例如:整型、布尔型等,也可以是另外一个文档,即文档可以嵌套。文档中的键类型只能是字符串。 

MongoDB和关系型数据库的一些主要区别如下:

MongoDB关系型数据库
数据模型文档模型关系模型
数据库类型OLTPOLTP
CRUD操作MQL(Mongo Query Language) SQL(Structured Query Language)
高可用复制集集群模式
横向扩展能力通过原生分片实现横向扩展数据分区或者分库分表
索引支持B树、全文索引、地理位置索引B树、B+树
数据容量理论上没有容量上限千万级别、亿级别
扩展方式垂直扩展+水平扩展垂直扩展

MongoDB的横向扩展能力对于开发人员来说是无感知的,底层是多种数据分布策略实现的分片架构,但是对外看到的还是单一的存储结构。通过这种黑盒式的横向扩展能力,可以支持海量数据和无缝扩容。

【安装MongoDB】 

进入MongoDB官网下载适合自己操作系统的安装包,我这里下载4.2.24版本。

MacOS安装MongoDB

下载下来后,解压以及一系列设置命令:

sudo mkdir -p /data/db #mongodb默认存储数据的目录,可以修改
sudo chmod -R 777 /data/db/
tar -xvf mongodb-macos-x86_64-4.2.24.tgz
mv mongodb-macos-x86_64-4.2.24/ mongodb
cd mongodb/
./bin/mongod #启动MongoDB服务
./bin/mongo #启动MongoDB客户端

推荐将MongoDB的程序目录加入到环境变量:

vim .bash_profile
#写入
export PATH=/Users/renxing/soft/mongodb/bin:$PATH;

source .bash_profile

#然后,就可以在任意目录下直接使用 mongod 和 mongo 命令了。

可以设定配置文件, 在 /Users/renxing/soft/mongodb/conf目录,增加配置文件mongo.conf,以下参数根据需要可选:

dbpath=/Users/renxing/soft/mongodb/data/db/ #数据保存路径

logpath=/Users/renxing/soft/mongodb/logs/mongo.log #日志保存路径

pidfilepath=/Users/renxing/soft/mongodb/pids/mongo.pid #进程描述文件

logappend=true #日志追加写入
bind_ip_all=true

port=27017 #mongodb默认端口

oplogSize=10000 #操作日志容量

fork=true #开启子进程

添加配置信息后,可以通过配置文件启动mongo服务端和客户端:

#带参数启动mongodb服务端
mongod -f /Users/renxing/soft/mongodb/conf/mongo.conf
##带参数启动mongodb客户端
mongo --host 127.0.0.1 --port 27017

Linux下的安装方式和Mac类似,不再赘述。 

Windows安装MongoDB

同样进入官网,下载msi格式的文件,然后点击安装。建议修改安装路径,不要装在C盘,我这里装在D盘。

接下来,可以选择不勾选“Install MongoDB Compass”,因为安装这个客户端比较耗费时间,我这里还是勾选上了,等待差不多1个小时左右。 也可以不勾选,自己安装一个“Navicat Premium”作为客户端使用。

 

 

 安装完成:

把安装目录加入到系统Path:

客户端连接 

推荐使用 Navicat Premium 连接MongoDB,可以看到图形化界面:

#对应的语句
db.getCollection("user").insert( { name: "zhangsan", age: 20, info: { address: "beijing", phone: "12345678" } } )
db.getCollection("user").find().limit(1000).skip(0)

使用命令行建库、添加数据的语句如下:

> show dbs #查看当前有哪些数据库
admin   0.000GB
config  0.000GB
local   0.000GB
> use test #切换到test库,如果不存在,则会直接创建
switched to db test
> show collections #查看当前库下面的集合
> db.createCollection('user') #创建一个集合
{ "ok" : 1 }
> db.getCollection("user").insert( { name: "zhangsan", age: 20, info: { address: "beijing", phone: "12345678" } } ) #插入数据
WriteResult({ "nInserted" : 1 })
> db.getCollection("user").find().limit(1000).skip(0) #查找数据
{ "_id" : ObjectId("649fb2cff641c3bddd5ba1a3"), "name" : "zhangsan", "age" : 20, "info" : { "address" : "beijing", "phone" : "12345678" } }

MongoDB的企业版在生产环境是收费的,开发环境免费;MongoDB的社区版在所有环境都可以免费使用。

关于MongoDB集群可以进入 https://cloud.mongodb.com/ 操作。

参考资料:
https://blog.csdn.net/weixin_42039228/article/details/123657641

https://blog.csdn.net/weixin_43405300/article/details/120017878

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Matlab SFM算法(两视图)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 基于运动恢复结构(SfM)是指从一组二维图像中估计场景中三维结构的过程。SfM算法被用于许多应用程序,例如3D扫描、增强现实和视觉同步定位和映射(vSLAM)。 SfM可以用许多不同的方法来计算。处理问题的方式取决于不同…

Quartz整合SpringBoot实现非持久化多任务运行

简介 java后端入门新手,对知识内容理解较浅,如文章内容有误,请各位大佬多多指点。本篇文章适用于对quartz有一定了解的入门新手,且并没有采用quartz官方的持久化方式,是在结合工作需求的基础上完成的quartz任务调度的…

【交换排序】手撕八大排序之快速排序和冒泡排序(超级详细)

目录 🍁一.快速排序 🍀Ⅰ.Hoare法 🍇Ⅱ.挖坑法 🍋1.递归版本 🍊2.关于时间复杂度 🍎3.快速排序的优化之三数取中法 🍌4.非递归版本(使用栈实现) 🍐5…

什么是文件存储、对象存储、块存储?

什么是文件存储 文件存储带有文件系统,主要是以文件的形式存放数据,能将所有的目录、文件形成一个有层次的树形结构来管理,通过“树”不断伸展的枝丫就能找到你需要的文件。存储协议主要是NFS、CIFS等,以统一命名空间的形式共享一…

docker安装rabbitMQ,JAVA连接进行生产和消费,压测

1.docker安装 docker安装以及部署_docker bu shuminio_春风与麋鹿的博客-CSDN博客 2.doker安装rabbitMQ 使用此命令获取镜像列表 docker search rabbitMq 使用此命令拉取镜像 docker pull docker.io/rabbitmq:3.8-management 这里要注意,默认rabbitmq镜像是…

剑指 Offer 47: 礼物的最大价值

这道题看的出来只能往右往下只能走4步。 应该是每次i或者j加1!不是先j后i 用for循,由于横纵坐标是固定的值(一条直线),所以i0,j所有情况这种组合可以全部计算出来,当i1时,j0这里也…

图像的IO操作

1.读取图像 cv.imread()2.显示图像 cv.imshow()3.保存图像 cv.imwrite()4.参考代码 import numpy as np import cv2 as cv import matplotlib.pyplot as plt# 1.读取图像:默认方式是彩色图 img cv.imread("yangmi.jpg") # 彩色图 gray_img cv.imre…

C语言进阶---程序的编译(预处理操作)+链接

1、程序的翻译环境和执行环境 在ANSI C的任何一种实现中,存在两个不同的环境。 第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。 第2种是执行环境,它用于实际执行代码。 1、每个源文件单独经过编译器处理,或生成一…

ps htop 输出可读文件

需要安装sudo apt-get install aha echo q | ps auxf | aha --black --line-fix > psps.html echo q | htop | aha --black --line-fix > htop.html 使用浏览器打开

Python神经网络学习(七)--强化学习--使用神经网络

前言 前面说到了强化学习,但是仅仅是使用了一个表格,这也是属于强化学习的范畴了,毕竟强化学习属于在试错中学习的。 但是现在有一些问题,如果这个表格非常大呢?悬崖徒步仅仅是一个长12宽4,每个位置4个动…

制造业网络安全最佳实践

网络安全已成为生产部门的一个重要关注点,制造业网络安全现在是高管层的主要考虑因素。 在工业 4.0和物联网 ( IoT )出现的推动下,当今的互连工业系统提供了多种优势,但也使组织面临新的风险和漏洞。 让我们探讨一些制造业网络安全最佳实践…

SOLIDWORKS软件有哪些版本?

SOLIDWORKS软件是基于Windows开发的三维 CAD系统,技术创新符合CAD技术的发展潮流和趋势,SOLIDWORKS每年都有数十乃至数百项的技术创新,公司也获得了很多荣誉。该系统在1995-1999年获得全球微机平台CAD系统评比NO1;从1995年至今&am…

Quiz 15: Object-Oriented Programming | Python for Everybody 配套练习_解题记录

文章目录 Python for Everybody课程简介 Quiz 15: Object-Oriented Programming单选题(1-11)Multiple instances Python for Everybody 课程简介 Python for Everybody 零基础程序设计(Python 入门) This course aims to teach e…

qemu 源码编译 qemu-system-aarch64 的方法

前言 最近调试 RT-Thread bsp qemu-virt64-aarch64 时,遇到无法使用网络设备问题,最后确认是 当前 ubuntu 20.04 系统 使用 apt install 安装的 qemu qemu-system-aarch64 版本太低。 RT-Thread qemu-virt64-aarch64 里面的网络设备,需要较新…

回顾分类决策树相关知识并利用python实现

大家好,我是带我去滑雪! 决策树(Decision Tree)是一种基本的分类与回归方法,呈树形结构,在分类问题中,表示预计特征对实例进行分类的过程。它可以认为是if-then规则的集合,也可以认为…

多表-DDL以及DQL

多表DDL 个表之间也可能存在关系 存在在一对多和多对多和一对多的关系 一对多(外键) 在子表建一哥字段(列)和对应父表关联 父表是一,对应子表的多(一个部门对应多个员工,但一个员工只能归属一…

结构体和数据结构--从基本数据类型到抽象数据类型、结构体的定义

在冯-诺依曼体系结构中,程序代码和数据都是以二进制存储的,因此对计算机系统和硬件本身而言,数据类型的概念其实是不存在的。 在高级语言中,为了有效的组织数据,规范数据的使用,提高程序的可读性&#xff0…

使用Streamlit和Matplotlib创建交互式折线图

大家好,本文将介绍使用Streamlit和Matplotlib创建一个用户友好的数据可视化Web应用程序。该应用程序允许上传CSV文件,并为任何选定列生成折线图。 构建Streamlit应用程序 在本文中,我们将指导完成创建此应用程序的步骤。无论你是专家还是刚刚…

three.js利用点材质打造星空

最终效果如图: 一、THREE.BufferGeometry介绍 这里只是做个简单的介绍,详细的介绍大家可以看看THREE.BufferGeometry及其属性介绍 THREE.BufferGeometry是Three.js中的一个重要的类,用于管理和操作几何图形数据。它是对THREE.Geometry的一…

leetcode 226. 翻转二叉树

2023.7.1 这题依旧可以用层序遍历的思路来做。 在层序遍历的代码上将所有节点的左右节点进行互换即可实现二叉树的反转。 下面上代码&#xff1a; class Solution { public:TreeNode* invertTree(TreeNode* root) {queue<TreeNode*> que;if(root nullptr) return{};que…