如何在MongoDB中建立新数据库和集合

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在MongoDB中建立新数据库和集合相关的知识,希望对你有一定的参考价值。

概念

一定范围的集合,确定的,可分辨的东西,作为一个整体来看,被称为集,称为集,其中,每个组元素或一种叫做短元件。不同的人物,如阿Q(1)真实的故事出现在(2)全部为大写字母。任何集合是它自己的子集的关系

收集要素:
集“归属感”和元素之间的关系“不属于”两种。分类

集合:
工会:属于A或B的元素是属于集合的元素被称为A和B(套),表示A∪B(或B∪A),读作“A和B”(或“B和A”),即A∪B= X |x∈A,或x∈B
路口:属于A和B是属于元素集合的元素称为A和B的薪酬(套),表示A∩B(或B∩A),读作“A交B”(或“B交A”),即A∩B= X |x∈A,和x∈ B
的区别:不属于A和B的一部分元素的元素集合称为差(套)
说明A和B:空集包含于任何集合,但不能说“空集属于任何集合“。

某些特定的对象集合在一起,就成为一个集合包含的元素叫做有限集包含的元素称为无限集合无限数量有限数,空集是不含任何元素的集合,记Φ。空集是任何集合的一个子集是真正的任何非空集的子集,没有集合是本身所有真正传递的一个子集的一个子集的一个子集。
“解释:如果所有的元素都同时设置B元素的集合,则A被称为B的一个子集,编写的B.如果A是B的一个子集,而A不等于B,?则A被称为B的真子集,编写的B.
集所有男人都是集自然“

集合中的所有真子集:?
确定性:可确定每个对象是不元素的集合,没有肯定它不能被设置,如“高同学”,“小的数字”不能构成的集合。
变化:任何两个元素的集合是不同的对象。不能被写为1,1,2,1,2应写入。
障碍:A,B,C C,B,A是同一个集合。
设置具有以下性质:如果A是包含在B,那么A∩B= A,A∪B=表示B

集合:枚举法常用和描述方法。
1.枚举法:用于每个有限集,该集列表出来的所有元素,写在括号内,这种表示被称为组枚举法。 1,2,3,...
2.描述法:常用的集合用来表达无限的,对文字,符号或公式,等集合中的共同财产元素描述,写在括号,其中的方法代表了一个名为描述方法的集合。 X | P(X为P为这个集合的共同财产元素的一般形式的集合中的元素),如:正实数少于π的集合,表示为:X | 0 < X <π
3的图式法:为了表达集合的形象,我们常常画一条封闭的曲线(或圆),用收集其内部表示。使用的符号

号码设定:
(1)中的所有非负整数的集合通常被称为一个非负整数(或一组自然数),表示为N
( 2)内的一组非负整数排除设置为0,也称为正整数,以N +表示的(或N *)
(3)组所有整数,通常称为整数集,表示由Z
(4)收集所有有理数通常称为集有理数,由Q
表示为(5)设定的所有实数的,通常被称为实数集,表示通过计算点击看详细收集:1。
交换
A∩B=B∩A
A∪B=B∪A
2.关联
(A∩B)∩C=A∩(B∩C)
(A∪B)∪C=A∪(B∪C)
3.分配
A∩(B∪C) =(A∩B)∪(A∩C)
A∪(B∩C)=(A∪B)∩(A∪C)的
2日摩根法律
铯(A ∩B)=CsA∪CsB
铯(A∪B)=CsA∩CsB

3“容斥原理”
在收集的学习,遇到涉及人数问题集合中的元素,我们限制在集合A的元素数,记为卡(A)中。例如,A = A,B,C,卡(A)= 3

卡(A∪B)=卡(A)+卡(B)-card(A∩B) BR>卡(A∪B∪C)=卡(A)+卡(B)+卡(C)-card(A∩B)-card(B∩C)-card(C∩A)+卡(A ∩B∩C)
1985年德国数学家,集合论,领唱者的创始人所讲的道集合,援引的法律,法律是描述收集的常用方法。点击看详细吸收法
A∪(A∩B)= A
A∩(A∪B)= A
补充法律
A∪CsA= S
A∩CsA=Φ点击看详细【聚焦】
理解藏品,藏品的性质,元素的集合,它们之间的关系代表的概念。子
收集,运送,以及相配套的意义和用法。掌握术语和符号,用准确的表示语言,研究收集,处理有关数学问题。
[难度]
的集合的概念的含义以及这些概念和它们之间的链路之间的差别。
准确的了解使用更多的新概念,新符号的处理数学问题。
参考技术A 数据库和集合(固定集合除外)不用手动创建,如果你连接一个不存在的数据库或者集合,MongoDB会自动创建相应的数据库和集合,你可以用命令行或者代码试试。

如何在MongoDB集合上创建索引

如何在MongoDB集合上创建索引

MongoDB Manual (Version 4.2)> Indexes > Index Builds on Populated Collections


本次我们将从以下几方面来了解如何在MongoDB集合上创建索引。


  • 行为

  • 索引构建对数据库性能的影响  

  • 复制集环境的索引生成

  • 构建失败和恢复

  • 监视正在进行的索引生成

  • 终止正在进行的索引生成

  • 索引生成过程


MongoDB 4.2版本新变化

对指定集合构建索引时会独占该集合的读写锁(注:构建索引时会锁表)。对集合构建索引时该集合读和写操作会加锁,直到mongod进程完成索引构建,该集合的读写操作锁才会释放。MongoDB 4.2对该过程进行了优化,仅在索引生成的开始和结束保留独占锁,构建索引的其余过程可对该集合进行交错读写操作。(注:MongoDB 4.2缩短了索引创建时的锁表时间)

索引构建过程汇总如下:

1. 初始化

mongod 进程对正在编制索引的集合使用独占锁。所有对该集合的读写操作将阻塞直到mongod 进程释放锁。在此期间,应用程序无法访问集合。


2. 数据提取和加工

mongod进程释放上一过程中获取的所有锁,然后针对被索引的集合获取一系列意向锁。在此期间,应用程序可以对集合发出读写操作。


3. 清理

mongod进程释放上一过程中获取的所有锁,然后针对被索引集合获取独占锁。这时将阻塞对该集合所有读写操作直到mongod进程释放锁。应用程序此时无法访问该集合。


4. 完成

mongod进程标记索引状态为已可用,然后释放索引构建过程中的所有锁。


索引构建过程中的加锁描述细节参见Index Build Process章节。更深入了解MongoDB的加锁行为参见FAQ: Concurrency。


行为

MongoDB 4.2索引构建过程完全替换了之前版本的索引构建过程。MongoDB忽视了createIndexes  命令或其shell中createIndex()createIndexes()函数的background选项。(注:MongoDB 4.2中无需在db.collectionName.createIndex()中设置{'background':true})。


需特性兼容版本设置为4.2版本


当MongoDB集群从4.0版本升级到4.2版本时,需设置特性兼容版本选项到4.2版本,以启用该优化过程,参见setFeatureCompatibilityVersion

MongoDB 4.2版本在特性兼容版本为4.0时,仅支持4.0的索引构建方式。


索引前后台创建的比较

先前版本的MongoDB支持前后台两种方式创建索引。前台构建索引方式速度更快且可生成更有效的数据结构,但在生成期间会阻塞该集合父数据库的所有读写操作。后台构建索引方式相比于前者速度更慢,且数据结构检索效率较低,但在索引构建过程中允许对数据库和正在构建索引集合的的读写访问。

MongoDB 4.2版本变化

MongoDB 4.2版本仅在索引构建过程的开始和结束阶段,针对构建索引的集合获得独占锁(注:进行锁表),避免元数据变更。索引构建过程的其余阶段,使用后台构建索引方式,以保证索引生成期间最大化集合读写访问。

MongoDB 4.2版本构建索引时的性能表现与基于后台的索引构建方式相当。索引构建期间,如果没有或者较低的更新操作负载下,4.2版本的索引构建速度可以与基于前台的索引构建方式一样快。

使用db.currentOp() 命令监测索引生成进度。


索引构建期间的约束冲突

对集合具有强制约束作用的索引,例如:unique 特性索引,  mongod进程会在索引构建完成后对所有预先存在的和并发写入的文档进行约束性检查。如果任何文档违反了索引约束条件,mongod进程将终止构建并抛出错误。

举例:对inventory集合的product_sku属性构建unique特性索引。如果任意文档的product_sku属性有重复值,索引构建过程仍可成功开始,如果在构建结束时仍然存在任何冲突,mongod进程会终止构建并抛出错误。

类似的,在索引构建的过程中,应用程序可成功对inventory集合写入product_sku属性值重复的文档。如果在构建结束时存在任何索引约束冲突,mongod进程会终止构建并抛出错误。

降低因违反约束而导致索引生成失败的风险:

  • 校验集合中没有违反索引约束的文档。

  • 停止所有可能违反该集合索引约束条件的应用程序写入操作。


索引构建对数据库性能的影响

高负载写入时的索引构建

在目标集合处于高负载写入状态时执行索引构建操作,会造成写入性能下降和更长的索引构建时间。

考虑指定一个维护窗口用于构建索引,在此期间停止或减少对目标集合的写入操作,以减少索引生成过程对性能的潜在负面影响。


可用系统内存不足时的索引构建

createIndexes命令支持在集合上构建多个索引。createIndexes命令同时使用内存和磁盘上的临时文件空间完成索引构建。createIndexes命令默认的内存使用限制是500MB,该空间在所有使用createIndexes命令生成的索引之间共享。一旦在构建索引时到达该空间限制,createIndexes命令将使用--dbpath目录下_tmp文件夹下的临时磁盘文件空间,用于完成索引构建。

你可以自定义maxIndexBuildMemoryUsageMegabytes参数,更改该空间大小限制。设置更高的内存空间可以在索引大小超500MB时更快完成索引构建。当然,该参数设置过高也会导致占用太多无用内存造成系统内存错误。

如果主机内存有限,你可能需要安排一个维护期,增加整个系统内存,再更改mongod进程中的内存参数设置。


复制集中的索引构建

为了尽量降低构建索引时对如下方面的影响:

  • 复制集中,使用滚动索引生成策略,如Build Indexes on Replica Sets章节所述。

  • 拥有分片复制集的分片集群中,使用滚动索引生成策略,如Build Indexes on Sharded Clusters章节所述。

你可以在主节点执行索引构建。索引生成完成后,从节点进行复制并开始索引构建。复制集中在开始构建索引之前请注意如下风险:


从节点可能不进行同步

从节点的索引构建将阻塞应用正在执行的对构建索引集合的事务操作。mongod进程在构建索引完成前将无法使用任何oplog。

如果索引生成在执行操作或命令时持有独占锁,则对被索引集合的复制写操作也可能被延迟到索引构建完成之后。mongod 进程无法使用任何oplog直到锁释放。如果复制延迟时间超过从节点的oplog window,从节点将不进行同步,需要通过重新同步来恢复。

在构建索引之前,使用rs.printReplicationInfo()命令鉴别每个副本集成员配置的时间区间中可处理的oplog大小。你可以增大oplog大小,降低从节点不同步的概率。例如,设置oplog的窗口可以覆盖72个小时的操作记录,只要确保从节点可以容忍这么久的复制延迟。

或者在维护时间窗口中执行索引构建,应用程序停止对该索引集合的所有事物操作、写操作和元数据操作。


从节点的索引构建可能造成读写操作延迟

MongoDB 4.2索引生成过程的开始和结束时获取正在索引的集合的独占锁。当从节点索引生成持有独占锁时,该从节点将暂停任何读写操作,直到索引生成释放该锁为止。


索引生成完成后,辅助进程索引将删除

在从节点完成索引构建的复制之前,在主节点删除索引,将不会中断从节点的构建。当从节点执行索引删除的复制操作时,其须等待之前的索引生成操作执行复制完毕。此外,由于索引删除是集合上的元数据操作,因此索引删除会暂停该从节点上的复制。


构建失败和恢复


单个mongod进程的索引构建中断

如果mongod进程在索引构建时终止了,索引构建任务和所有进程将丢失。重启mongod进程不会重新执行索引构建,你必须重新运行createIndex() 操作来重启索引构建。


主节点mongod进程的索引构建中断

如果主节点在索引构建时停止了,索引构建任务和所有进程将丢失。重新启动mongod不会重新启动索引构建,你必须重新运行createIndex() 操作来重启索引构建。


从节点mongod进程的索引构建中断

如果从节点在索引构建时停止了,索引构建任务将保留。重启 mongod进程将恢复索引构建并从头重新开始。

启动进程会在任意已恢复的索引生成之后暂停。所有操作,包括复制将进入等待直到索引构建完成。如果从节点的oplog未在时间窗口区间完成缩影索引构建的复制,从不再进行这部分oplog的复制集的同步,需要重新同步恢复。

如果你重启了mongod进程作为独立的复制集节点实例或删除--replSetName)。mongod进程仍将从头恢复索引构建。你可以使用storage.indexBuildRetry配置文件设置或写入命令行参数--noIndexBuildRetry

MongoDB 4.0以上版本

你不能对副本集中的一个mongod进程实例,设置storage.indexBuildRetry选项  或  --noIndexBuildRetry选项。


构建过程中的回滚

从4.0版本开始,MongoDB在任意正在执行索引构建的进程完成后进行rollback。


监视正在进行的索引生成

你可以在mongo  shell中执行db.currentOp()命令,查看索引构建操作的状态。筛选当前操作中的索引创建操作,参见Active Indexing Operations操作。

msg包含了索引构建当前阶段的完成百分比。


终止正在进行的索引生成

终止主节点或单个  mongod 进程中正在执行的索引构建命令,请在mongo进程中使用db.killOp()命令。当终止索引生成时,db.killOp()命令可能不会立即执行,并可能在大部分索引生成操作完成后执行。

你无法终止一个已经在复制集从节点进行复制的索引构建操作。你必须首先在主节点drop删除索引。从节点将复制删除操作并在索引构建完成后删除索引。所用复制操作将阻塞直到索引构建完成并执行完删除操作。

尽量降低复制集和拥有复制集的分片集群的构建索引影响,参见:

  • Build Indexes on Replica Sets

  • Build Indexes on Sharded Clusters


索引生成过程

下方表格描述索引构建过程中的每个阶段:

阶段 描述
mongod 进程获得索引集合的独占X锁。该集合的所有读写操作被阻塞,包括应用程序对该集合所有复制写操作或者元数据指令。mongod进程不会释放独占锁。
初始化 mongod进程在该初始状态创建三个数据结构:初始索引元数据项。一张临时表("side writes table"),用来存储构建过程中对索引集合进行写入时生成的key。一张临时表(“constraint violation table”),用于存储可能导致重复键约束冲突的所有文档。
mongod 进程将之前获取的独占锁X降级为意图独占锁IXmongod进程周期性的释放该锁,允许进行交错读写操作。
扫描集合 mongod进程对集合中每个文档生成一个key,并将该key存储到外部分类器中,如果 mongod进程在集合扫描期间发现重复key,它会将该key存储在constraint violation表中以备后续处理。如果mongod进程在生成key时遇到任何其他错误,构建将失败并出现错误。一旦mongod进程完成集合扫描,它将分类的key转储到索引中。
处理临时表Side Writes Table mongod 使用先进先出方式处理Side Writes Table表中数据,如果遇到重复key,将该key写入constraint violation table表以备后续处理。如果mongod进程在处理键时出现任何异常错误,构建将失败。对于每个在索引构建过程中写入集合的文档,mongod进程都会给该文档生成一个key,并将其存储到side write table表中。mongod使用快照系统设置要处理的key的数量限制。
mongod进程将索引集合上的意图独占锁IX升级为共享S锁。这会阻塞该集合的所有写操作,包括应用程序对该集合的任何复制写操作或元数据操作。
完成对Temporary Side Writes Table表的处理 mongod进程继续处理Side Writes Table表中的存量数据。mongod进程在该阶段可能会暂停复制。如果遇到重复key,将该key写入constraint violation table表以备后续处理。如果mongod进程在处理键时出现任何异常错误,构建将失败。
mongod进程将索引集合的共享S锁升级成独占X锁。该集合的所有读写操作被阻塞,包括应用程序对该集合所有复制写操作或者元数据指令操作。mongod进程不会释放独占锁。
删除Side Write Table表 mongod在处理完Side Write Table表中所有数据后将其删除。如果遇到重复key,将该key写入constraint violation table表以备后续处理。如果mongod进程在处理键时出现任何异常错误,构建将失败。
处理Constraint Violation Table表 mongod进程使用先入先出的方式处理Constraint Violation Table表中数据,之后删除该表。如果其中任何键仍然出现重复键错误,mongod将终止构建并抛出错误。mongod进程在处理完Constraint Violation Table表后或出现重复键约束时将删除该表。
标记索引已就绪 mongod将索引元数据更新为可使用状态。
mongod进程释放该索引集合的独占X锁。


原文链接:https://docs.mongodb.com/manual/core/index-creation/


译者:程哲欣

MongoDB中文社区翻译小组成员

目前是中国移动杭州研发中心高级软件工程师,信息系统项目管理师专业资格。

业余爱好:网球,游泳,跑步。





点个“在看”分享下

以上是关于如何在MongoDB中建立新数据库和集合的主要内容,如果未能解决你的问题,请参考以下文章

如何在MongoDB中建立新数据库和集合

如何在两个 MongoDB 数据库之间同步一些集合?

Node.JS、Express 和 MongoDB :: 多个集合

如何在mongoDB中列出集合的所有者

如何在 mongoDB 中取消嵌套和分组集合

如何在MongoDB集合上创建索引