MongoDB的简单使用

MongoDB(文档数据库)的简单使用

MongoDB最好的学习资料就是他的官方文档:SQL 到 MongoDB 的映射图表 - MongoDB 手册 v8.0

1.MongoDB CRUD操作

1.1Insert操作

基本方法:

  • db.collection.insertOne()    将单个文档(document)插入集合中

  • db.collection.insertMany()  将多个文档(document)插入到集合中

注意:插入操作针对的是单个集合。MongoDB 中的所有写入操作在单个文档级别都具有原子性。

示例:

1.2Select操作

基本方法:

  • db.collection.find()

示例:

1.3Update操作

基本方法:

  • db.collection.updateOne()

  • db.collection.updateMany()

  • db.collection.replaceOne()

在 MongoDB 中,更新操作针对的是单个集合。MongoDB 中的所有写入操作在单个文档级别都具有原子性。

示例:

1.4Delete操作

基本方法:

  • db.collection.deleteOne()

  • db.collection.deleteMany()

在 MongoDB 中,删除操作针对的是单个集合。MongoDB 中的所有写入操作在单个文档级别都具有原子性。

示例:

 2.MongoDB 分片

2.1概念

分片是一种跨多台机器分布数据的方法。MongoDB 使用分片来支持超大数据集和高吞吐量操作的部署。

存在大型数据集或高吞吐量应用程序的数据库系统可能对单个服务器的容量构成挑战。例如,较高的查询速率可能会耗尽服务器的 CPU 容量。大于系统 RAM 的工作集大小会对磁盘驱动器的 I/O 容量造成压力。

因此,有两种方法可解决系统增长问题:垂直扩展和水平扩展。

(1)Vertical Scaling(垂直扩展)涉及增大单个服务器的容量,例如使用更强大的 CPU、添加更多 RAM 或增加存储空间量。可用技术所存在的限制可能会导致单个机器对给定工作负载来说不够强大。此外,基于云的提供商存在基于可用硬件配置的硬上限。因此,垂直扩展存在实际的最大值。

(2)Horizontal Scaling(横向(水平)扩展)涉及将系统数据集和负载划分到多个服务器,以及按需增加服务器以提高容量。虽然单个机器的总体速度或容量可能不高,但每个机器均可处理总体工作负载的一部分,因此可能会比单个高速、高容量服务器提供更高的效率。扩展部署的容量只需按需添加额外的服务器,而这可能会比单个机器的高端硬件的整体成本更低。但代价在于它会增大部署的基础设施与维护的复杂性。

MongoDB 支持通过分片进行水平扩展

2.2分片集群

描述了分片集群内各组件之间的交互:

MongoDB分片集群由以下组件构成:

(1)分片:每个分片都包含分片数据的一个子集。

(2)mongos:mongos 充当查询路由器,在客户端应用程序和分片集群之间提供接口。

(3)配置服务器:配置服务器会存储集群的元数据和配置设置。配置服务器必须部署为副本集 (CSRS)。

综上所述:一个基本的Mongodb集群需要配置MASTER节点-SLAVE节点-路由节点-仲裁节点

2.3分片键/数据段

2.3.1分片键

作用:MongoDB 使用分片键在分片之间分发集合的文档。 分片键由文档中的一个或多个字段组成。

分片集合中的文档可能缺少分片键字段。跨分片分发文档时,缺少的分片键字段将视为具有 null 值,但在路由查询时则不会。

注意:

  • 从在MongoDB 5.0 开始,您可以通过更改集合的分片键对集合重新分片。

  • 您可以通过向现有分片键添加后缀字段或字段来优化分片键。

(1)分片键索引

要对已填充的集合进行分片,该集合必须具有以分片键开头的索引。对空集合进行分片时,如果该集合还没有指定分片键的适当索引,MongoDB 会创建支持索引。请参阅分片键索引。

(2)分片键策略

分片键的选择会影响分片集群的性能、效率和可扩展性。 具有最佳硬件和基础架构的集群可能会因为选择分片键而遇到瓶颈。 分片键及其后备索引的选择也会影响集群可以使用的分片策略。

2.3.2数据段

MongoDB 将数据分片为数据段。每个数据段都有一个基于分片键、包含下限且不包含上限的范围。

2.3.3负载均衡器和均匀数据分布

为了实现数据在集群中所有分片上的均匀分布,负载均衡器会在后台运行,以便在各分片之间迁移范围。

2.4分片的优点

(1)读取/写入

MongoDB 在分片集群中的分片之间分配读写工作负载,支持每个分片处理集群操作的子集。通过添加更多的分片,读写工作负载都可以在集群中横向扩展。

对于包含分片键或复合分片键前缀的查询,mongos 可将查询定向到特定分片或一组分片。这些有针对性的操作通常比向集群中的每个分片进行广播更为有效。

(2)存储容量

分片将数据分布在集群中的分片上,从而允许每个分片包含整个集群数据的子集。随着数据集的增长,更多的分片会增加集群的存储容量。

(3)高可用性

按副本集部署配置服务器和分片,可提高可用性。

即使一个或多个分片副本集变为完全不可用,分片集群仍可继续执行部分读取和写入操作。换言之,即便无法访问不可用分片上的数据,针对可用分片的读取或写入仍可成功完成。

注意:

需要对分片集群基础架构的需求和复杂性进行仔细规划、执行和维护。

虽然您可在后续对集合重新分片,但请务必仔细考虑分片键的选择,以免出现可扩展性与性能问题。

3.SQL到MongoDB的映射表

下表列出各种SQL术语和概念以及相应的MongoDB术语和概念

传统关系型数据库中SQL术语/概念NoSQL型MongoDB数据库术语/概念
databasedatabase
数据表(table)集合(collection)
文档或BSON文档
字段
索引(index)索引(index)
表连接$lookup,嵌入式文档
主键主键
指定任何唯一列或列组合作为主键在MongoDB中,主键会自动设置为_id字段
聚合(例如分组依据)聚合管道(请参阅 SQL 聚合映射图表)
SELECT INTO NEW_TABLE$out( 请参阅SQL 聚合映射图表)
MERGE INTO TABLE$merge(请参阅 SQL 聚合映射图表)
UNION ALL$unionWith
事务事务(在许多场景中,非规范化数据模型(嵌入式文档和数组),而不是多文档事务,将继续是数据和使用案例的最佳选择。换言之,对于许多场景,适当地建模数据将最大限度地减少对多文档事务的需求)

3.1可执行程序的对比

MongodbMySQLOracle
数据库服务mongodmysqldoracle
数据库客户端mongoshmysqlsqlplus

4.SQL语句之间的对比

如下代码表示在MongoDB中的一个集合中一条数据记录的状态;

示例:

{
  _id: ObjectId("509a8fb2f3f4948bd2f983a0"),
  user_id: "abc123",
  age: 55,
  status: 'A'
}

4.1创建和更改

下表列出了与表级动作相关的各种SQL语句以及对应的MongoDB语句。

(1)SQL模式语句

创建表:

CREATE TABLE people (
    id MEDIUMINT NOT NULL
        AUTO_INCREMENT,
    user_id Varchar(30),
    age Number,
    status char(1),
    PRIMARY KEY (id)
)

修改表:

ALTER TABLE people
ADD join_date DATETIME
ALTER TABLE people
DROP COLUMN join_date

 创建索引:

CREATE INDEX idx_user_id_asc
ON people(user_id)
CREATE INDEX
       idx_user_id_asc_age_desc
ON people(user_id, age DESC)

删除表:

DROP TABLE people

(2)对应上述SQL语句的MongoDB语句

创建集合

注意:如果该集合当前不存在,则插入操作将创建该集合。

a.隐式的创建一个集合

在第一个 insertOne() 或 insertMany() 操作上隐式创建。如果未指定 _id 字段,则会自动添加主键 _id

db.people.insertOne( {
    user_id: "abc123",
    age: 55,
    status: "A"
 } )

b.显示的创建一个集合

db.createCollection("people")

修改集合

集合并不描述或强制执行其文档的结构;也就是说,集合层面上不会有结构变化。

不过,在文档级别,updateMany() 操作可以使用 $set 操作符将字段添加到现有文档中。

db.people.updateMany(
    { },
    { $set: { join_date: new Date() } }
)

集合并不描述或强制执行其文档的结构;也就是说,集合层面上不会有结构变化。

不过,在文档级别,updateMany() 操作可以使用 $unset 操作符从文档中删除字段。

db.people.updateMany(
    { },
    { $unset: { "join_date": "" } }
)

创建索引

db.people.createIndex( { user_id: 1 } )
db.people.createIndex( { user_id: 1, age: -1 } )

删除集合

db.people.drop()

4.2Insert

(1)传统SQL

INSERT INTO people(user_id,
                  age,
                  status)
VALUES ("bcd001",
        45,
        "A")

(2)MongoDB

db.people.insertOne(
   { user_id: "bcd001", age: 45, status: "A" }
)

4.3Select

(1)传统SQL

(1)SELECT * FROM people

(2)SELECT id,user_id,status FROM people

(3)SELECT user_id, status FROM people

(4)SELECT * FROM people WHERE status = "A"

(5)SELECT user_id, status FROM people WHERE status = "A"

(6)SELECT * FROM people WHERE status != "A"

(7)SELECT * FROM people WHERE status = "A" AND age = 50

(8)SELECT * FROM people WHERE status = "A" OR age = 50

(9)SELECT * FROM people WHERE age > 25

(10)SELECT * FROM people WHERE age < 25

(11)SELECT * FROM people WHERE age > 25 AND   age <= 50

(12)SELECT * FROM people WHERE user_id like "%bc%"

(13)SELECT * FROM people WHERE user_id like "bc%"

(14)SELECT * FROM people WHERE status = "A" ORDER BY user_id ASC

(15)SELECT * FROM people WHERE status = "A" ORDER BY user_id DESC

(16)SELECT COUNT(*) FROM people

(17)SELECT COUNT(user_id) FROM people

(18)SELECT COUNT(*) FROM people WHERE age > 30

(19)SELECT DISTINCT(status) FROM people

(20)SELECT * FROM people LIMIT 1

(21)SELECT * FROM people LIMIT 5 SKIP 10

(22)EXPLAIN SELECT * FROM people WHERE status = "A"

(2)MongoDB

(1)db.people.find()

(2)db.people.find(
    { },
    { user_id: 1, status: 1 }
)

(3)db.people.find(
    { },
    { user_id: 1, status: 1, _id: 0 }
)

(4)db.people.find(
    { status: "A" }
)

(5)db.people.find(
    { status: "A" },
    { user_id: 1, status: 1, _id: 0 }
)

(6)db.people.find(
    { status: { $ne: "A" } }
)

(7)db.people.find(
    { status: "A",
      age: 50 }
)

(8)db.people.find(
    { $or: [ { status: "A" } , { age: 50 } ] }
)

(9)db.people.find(
    { age: { $gt: 25 } }
)

(10)db.people.find(
   { age: { $lt: 25 } }
)

(11)db.people.find(
   { age: { $gt: 25, $lte: 50 } }
)

(12)db.people.find( { user_id: /bc/ } )
或
db.people.find( { user_id: { $regex: /bc/ } } )

(13)db.people.find( { user_id: /^bc/ } )
或
db.people.find( { user_id: { $regex: /^bc/ } } )

(14)db.people.find( { status: "A" } ).sort( { user_id: 1 } )

(15)db.people.find( { status: "A" } ).sort( { user_id: -1 } )

(16)db.people.count()
或
db.people.find().count()

(17)db.people.count( { user_id: { $exists: true } } )
或
db.people.find( { user_id: { $exists: true } } ).count()

(18)db.people.count( { age: { $gt: 30 } } )
或
db.people.find( { age: { $gt: 30 } } ).count()

(19)db.people.aggregate( [ { $group : { _id : "$status" } } ] )
或,对于不超过 BSON 大小限制的非重复值集
db.people.distinct( "status" )

(20)db.people.findOne()    或    db.people.find().limit(1)

(21)db.people.find().limit(5).skip(10)

(22)db.people.find( { status: "A" } ).explain()

4.4Update

(1)传统SQL

UPDATE people
SET status = "C"
WHERE age > 25

UPDATE people
SET age = age + 3
WHERE status = "A"

(2)MongoDB

db.people.updateMany(
   { age: { $gt: 25 } },
   { $set: { status: "C" } }
)

db.people.updateMany(
   { status: "A" } ,
   { $inc: { age: 3 } }
)

4.5Delete

(1)传统SQL

DELETE FROM people
WHERE status = "D"

DELETE FROM people

(2)MongoDB

db.people.deleteMany( { status: "D" } )

db.people.deleteMany({})

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【射频IC进阶实践教程】2.6 LNA版图设计及DRC/LVS验证

射频集成电路的版图设计非常关键&#xff0c;他对寄生参数非常敏感&#xff0c;需要使其最小化。还需要注意相互耦合的方式本次课程主要介绍射频IC的一些相关布局和连线方面的考虑。 一、版图设计 1. 版图的元件布局 首先打开对应的原理图 点击进行版图设计 由于已经有做好的…

go语言的sdk项目搭建与git 操作标签tag并推送至远程仓库

在搭建 SDK 项目并结合 Git 操作标签&#xff08;Tag&#xff09;时&#xff0c;通常会涉及项目初始化、版本管理、Git 标签的创建与管理等内容。以下是一个完整的步骤指南&#xff0c;帮助您搭建 SDK 项目并学习如何使用 Git 标签。 ### 1. **搭建 SDK 项目** 首先&#xff…

超融合承载 PostgreSQL 数据库和 AI 系统的性能评测|金融行业实践

随着人工智能技术的日渐成熟&#xff0c;不少金融用户也开发了自己的 AI 应用系统&#xff0c;协助实际业务中诸如文字识别、图像转换、信息录入等工作&#xff0c;提升业务效率。不过&#xff0c;AI 应用系统普遍依赖 GPU 提供强大算力&#xff0c;对底层存储的性能也有较高的…

数据结构代码归纳

线性表 线性表的顺序表示 定义与初始化 typedef struct SqList{ElemType data[MaxSize];//ElemType *data 开动态数组 int length; }Sqlist; void InitList(SqList &L){L.length0;//若静态数组//若动态数组 //L.data(ElemType*)malloc(sizeof(ElemType)*MaxSize); } …

华为的USG6000为什么不能ping通

前言&#xff1a; 防火墙usg6000v的镜像 链接: https://pan.baidu.com/s/1uLRk0-hnHRTLYLx1Pnplow?pwdtymp 提取码: tymp 看了好多毒文章&#xff0c;感觉写作业更有意思&#xff0c;可以了解新的知识 内容&#xff1a; 首先看毒文章是这样说的&#xff0c;华为的防火墙是…

“量子跃迁与数据织网:深入探索K最近邻算法在高维空间中的优化路径、神经网络融合技术及未来机器学习生态系统的构建“

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大二学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…

VTK编程指南<三>:基于VTK入门程序解析来理解VTK基础知识

1、VTK入门程序 下面是一个完整的Vtk入门程序&#xff0c;我们基于这个程序来对VTK的基本知识进行一个初步了解。 #include <iostream>#include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL2);// VTK was built with vtkRenderingOpenGL2 VTK_MODULE_INI…

汽车免拆案例 | 2007款宝马650i车发动机偶尔无法起动

故障现象 一辆2007款宝马650i车&#xff0c;搭载N62B48B发动机&#xff0c;累计行驶里程约为26万km。车主反映&#xff0c;发动机偶尔无法起动&#xff0c;故障频率较低&#xff0c;十几天出现1 次&#xff0c;且故障出现时起动机不工作。 故障诊断  接车后试车&#xff0c;…

Kafka单机及集群部署及基础命令

目录 一、 Kafka介绍1、kafka定义2、传统消息队列应用场景3、kafka特点和优势4、kafka角色介绍5、分区和副本的优势6、kafka 写入消息的流程 二、Kafka单机部署1、基础环境2、iptables -L -n配置3、下载并解压kafka部署包至/usr/local/目录4、修改server.properties5、修改/etc…

python中的列表、元组、字典的介绍与使用

目录 一、区别介绍 1.使用场景以及区别图 2.详细介绍 列表 元组 字典 二、例子操作 (一)列表list 1.定义和初始化 2.访问元素&#xff08;下标&#xff09; 3.修改元素&#xff08;下标&#xff09; 4.添加元素&#xff08;append、下标insert&#xff09; 5.删除…

WiFi受限不再愁,电脑无网络快速修复指南

有时在试图连接WiFi时&#xff0c;会发现网络连接受限&#xff0c;或无法正常访问互联网。这种情况不仅影响了工作效率&#xff0c;还可能错过重要的信息。那么&#xff0c;究竟是什么原因导致了电脑WiFi连接受限呢&#xff1f;又该如何解决这一问题呢&#xff1f;小A今天就来教…

【技巧】Mac上如何显示键盘和鼠标操作

在制作视频教程时&#xff0c;将键盘和鼠标的操作在屏幕上显示出来&#xff0c;会帮助观众更容易地理解。 推荐Mac上两款开源的小软件。 1. KeyCastr 这款工具从2009年至今一直在更新中。 https://github.com/keycastr/keycastr 安装的话&#xff0c;可以从Github上下载最…

c++ map对其值排序

无法直接排序,转换成vector<std::pair<string,int>> #include <iostream> #include <map> #include <vector> #include <algorithm>// 用于排序的比较函数 bool compareByValue(const std::pair<std::string, int>& a, const …

调度器、闲逛进程

调度器、闲逛进程 一、调度器/调度程序二、闲逛进程 一、调度器/调度程序 ②、③由调度程序引起&#xff0c;调度程序决定&#xff1a; 让谁运行&#xff1f;-- 调度算法 运行多长时间&#xff1f;-- 时间片大小 调度时机 – 什么事件会触发“调度程序”&#xff1f; ∙ \bull…

第七节(1)、T型加减速转动【51单片机-TB6600驱动器-步进电机教程】

摘要&#xff1a;本节介绍步进电机T型加减速的控制方法&#xff0c;分2个小节&#xff0c;本小节主要内容为该控制方法的推导与计算&#xff0c;第二节对T型加减速进行了简化计算 一.加速阶段计算 1.1 计算时间与步数关系 根据位移公式可得&#xff1a; a n g l e 0 n ∗ s…

利用 360 安全卫士极速版关闭电脑开机自启动软件教程

在使用电脑的过程中&#xff0c;过多的开机自启动软件会严重拖慢电脑的开机速度&#xff0c;影响我们的使用体验。本教程中简鹿办公将详细介绍如何使用 360 安全卫士极速版关闭电脑开机自启动软件&#xff0c;让您的电脑开机更加迅速流畅。 一、打开 360 安全卫士极速版 在电…

车联网安全学习之TBOX

Telematics BOX&#xff0c;简称 T-BOX&#xff0c;也称远程信息处理控制单元&#xff08;Telematics Control Unit, TCU&#xff09;&#xff0c;集成GPS、外部通信接口、电子处理单元、微控制器、移动通信单元和存储器等功能模块。 TBOX 提供的功能有网络接入、OTA、远程控制…

神经网络入门实战:(六)PyTorch 中的实用工具 SummaryWriter 和 TensorBoard 的说明

(一) SummaryWriter 这里先讲解 SummaryWriter &#xff0c;TensorBoard 会在第二大点进行说明。 SummaryWriter 是 PyTorch 中的一个非常实用的工具&#xff0c;它主要用于将深度学习模型训练过程中的各种日志和统计数据记录下来&#xff0c;并可以与 TensorBoard 配合使用&am…

C#实现一个HttpClient集成通义千问-开发前准备

集成一个在线大模型&#xff08;如通义千问&#xff09;&#xff0c;来开发一个chat对话类型的ai应用&#xff0c;我需要先了解OpenAI的API文档&#xff0c;请求和返回的参数都是以相关接口文档的标准进行的 相关文档 OpenAI API文档 https://platform.openai.com/docs/api-…

开发知识点-uniCloud

开发知识点-uniCloud 服务空间云函数 cloudfunctions云对象importObjectJSON 格式的文档型数据库Collection unicloud数据的指定表集合 DB SchemaJQL 语法参考资料 服务空间 项目关联空间 云函数 cloudfunctions 云对象importObject JSON 格式的文档型数据库 nosql 非关系…