MongoDB入门及规则限制

MongoDB入门快捷方式可选择免费在线托管服务MongoDB Atlas,以此快速进入MongoDB相关功能特性的学习实践中。

MongoDB Atlas免费集群

MongoDB Atlas是一项云托管服务,用于配置、运行、部署、监控、维护MongoDB,是一种免费创建Mongo集群的方式,是快速入门MongoDB的选择。

MongoDB数据库概念

MongoDB将BSON文档(即数据记录)存储在数据库中集合中。

mongodb databases and collections

MongoDB数据库命令

MongoDB选择数据库

--cil-*use myDB

MongoDB创建数据库

如果数据库不存在,MongoDB会在该数据库第一次存储数据时创建,所以,可以使用use命令切换到一个不存在的数据库,然后执行insert。

use myNewDB

db.myNewCollection1.insertOne( { x: 1 } )

如果执行insertOne()时,数据库myNewDB和集合myNewCollection1尚不存在,则该操作将创建它们。

MongoDB集合(collections)

MongoDB将文档存储在集合中,集合类似于关系数据库中的表。默认情况下,集合不要求其文档具有相同的模式;也就是说,单个集合中的文档不需要具有相同的字段集,而字段的数据类型在集合的不同文档中也可以不同。但是,从MongoDB 3.2开始,可以在更新和插入操作期间,强制执行集合的文档验证规则

创建集合

如果集合不存在,MongoDB会在该集合第一次存储数据时创建集合。

db.myNewCollection2.insertOne( { x: 1 } )
db.myNewCollection3.createIndex( { y: 1 } )

如果集合不存在,无论是insertOne()或createIndex()操作都会创建各自的集合。

显式创建集合

MongoDB使用db.createCollection()创建集合,并提供了各种选项用于创建集合。例如:设置最大限制或文档验证规则。如果不使用任何选项,则无需显式创建集合,因为MongoDB在首次存储数据时会创建新集合。

修改集合

MongoDB使用collMod向集合添加选项或修改视图定义,该命令采用以下原型形式:

db.runCommand( { collMod: <collection or view>, <option1>: <value1>, <option2>: <value2> ... } )

使用db.collection.stats()输出中的userFlags字段检查为集合启用的选项。

{keyPattern: <index_spec> || name: <index_name>, expireAfterSeconds: <seconds> }

集合命名限制

在MongoDB中数据库名称是不区分大小写的。

对于在Windows上运行的MongoDB,数据库名称不能包含以下任何字符:

--regex-*/\. "$*<>:|?

数据库名称也不能包含空字符。

对于在Unix和Linux系统上运行的MongoDB,数据库名称不能包含以下任何字符:

/\. "$

数据库名称不能为空,且必须少于64个字符。

集合名称应以下划线或字母开头,不能包含$,不能是空字符串,不能以system.前缀开始(保留供内部使用)。

如果集合名称包含特殊字符(下划线字或以数字开头),在访问集合时需使用shell中的db.getCollection()方法mongo或驱动程序的类似方法。

MongoDB命名空间限制

集合命名空间的最大长度为120个字节,包括数据库名称,点分隔符(.)和集合名称在内,即

<database>.<collection>

对于MMAPv1,名称空间的数量限制为名称空间文件的大小除以628。一个16M的命名空间文件,可以支持大约24,000个命名空间。每个集合和索引都是命名空间。

默认情况下,命名空间文件为16兆字节。可以使用nsSize选项配置大小。

WiredTiger存储引擎不受这个限制。

MongoDB视图

视图是只读的行为,对视图执行写操作会出错。视图使用基础集合的索引。由于索引位于基础集合上,因此,无法直接在视图上创建、删除或重新构建索引,也无法在视图上获取索引列表。无法$natural在视图上指定排序。

从3.4版开始,MongoDB增加了对从现有集合或其他视图创建只读视图的支持。

视图作为底层聚合管道的一部分,MongoDB对视图执行读取操作,在读取操作期间按需计算视图。因此,视图不支持以下操作:

--json-*db.collection.mapReduce(),

$text 运算符,因为$text聚合操作仅对第一阶段有效,

$geoNear 管道阶段和已弃用的geoNear命令。

如果用于创建视图的聚合管道禁止_id字段,则视图中的文档则不具有_id字段。

分片视图

如果视图的基础集合是分片的,则视图将被视为分片。因此,无法为from字段$lookup和$graphLookup操作指定分片视图。

视图和整理

可以在创建时为视图指定默认排序规则。如果未指定排序规则,则视图的默认排序则会使用简单的对二进制比较排序。也就是说,视图不会继承集合的默认排序规则。
视图上的字符串比较使用视图的默认排序规则。尝试更改或覆盖视图的默认排序规则的操作将会失败。如果从另一个视图创建视图,则无法指定与源视图的排序规则不同的排序规则。如果执行涉及多个视图的聚合(例如使用$lookup或)$graphLookup,则视图必须具有相同的排序规则。

公共视图定义

列出集合的操作,如db. getcollectioninfo()和db.getCollectionNames(),在它们的输出中包含视图。

删除视图

要删除视图,在视图上使用以下方法。

db.collection.drop()

修改视图

使用collMod命令修改视图,也可以通过删除和重新创建视图达到修改视图的效果。

MongoDB字段命名限制

字段名称不能包含该null字符。

顶级字段名称不能以$字符开头。

从MongoDB 3.6开始,服务器允许存储包含点(.)和美元符号($)的字段名称。

MongoDB索引限制

MongoDB索引项的总大小应小于1024字节,根据BSON类型,索引项可能包含结构开销。如果现有文档的索引条目超过索引限制,MongoDB将不会在集合上创建索引。以前版本的MongoDB会创建索引,但不会索引这样的文档。

如果索引字段的索引项超过索引键限制,则重索引操作将出错。重新索引操作作为compactrepair命令及db.collection.reIndex()方法的一部分执行。


由于这些操作是从集合中删除所有索引,然后按顺序重建索引,因此,索引键限制抛出的错误,会阻止集合中剩余索引的重建工作,对于repairDatabase命令,也阻止该过程的其余部分。

MongoDB不会向索引集合中插入任何具有索引字段的文档,MongoDB的早期版本会执行插入但不索引这些文档。

如果更新后的值导致索引项超过索引键限制,则对索引字段的更新将出错。

如果现有文档包含索引字段,而该字段的索引条目超过了该限制,则导致在磁盘上重新定位该文档的任何更新都将出错。

mongorestoremongoimport不会插入包含索引字段的文档,该字段对应的索引条目将超过索引键限制。

对于已存的分片集合,如果块的文档包含索引字段,且索引项超过索引键限制,则块迁移将失败。

单个集合的索引不能超过64个,复合索引中的字段不能超过32个。

如果从覆盖索引返回的查询字段值是NaN,则该NaN值的类型始终为double。多键索引不能覆盖数组字段上的查询。

地理空间索引无法执行覆盖查询

更改索引的到期时间

db.runCommand( { collMod: "sessions",
                 index: { keyPattern: { lastAccess: 1 },
                          expireAfterSeconds: 3600
                        }
})

{ "expireAfterSeconds_old" : 1800, "expireAfterSeconds_new" : 3600, "ok" : 1 }