MongoDB入门

MongoDB入门练习可使用MongoDB Atlas免费托管服务,了解MongoDB相关功能特性。

MongoDB Atlas集群

MongoDB Atlas是一项云托管服务,用于配置、运行、部署、监控、维护MongoDB,可免费创建Mongo集群。

MongoDB概念

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

mongodb databases and collections

命令

选择数据库

use myDB

建库

若数据库不存在,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()操作都会创建各自的集合(若不存在)。

显式创建

使用db.createCollection()创建集合,并提供参数选项。如:设置最大限制或文档验证规则。若不使用选项,则无需显式创建。

修改集合

使用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,数据库名称不能包含以下字符:

/\. "$*<>:|?

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

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

/\. "$

数据库名称不能为空,且不超过64个字符。

集合名称应以下划线或字母开头,不能包含$,不能是空字符串,不能以system.前缀开始。

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

命名空间限制

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

<database>.<collection>

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

每个集合和索引都是命名空间。默认命名空间文件为16兆,可使用nsSize配置大小。WiredTiger存储引擎不受此限制。

MongoDB视图

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

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

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

db.collection.mapReduce(),
$text 运算符,因为$text聚合操作仅对第一阶段有效,
$geoNear 管道阶段和已弃用的geoNear命令。

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

分片视图

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

视图和整理

可在创建时为视图指定默认排序规则。若未指定则默认使用简单的二进制比较排序。也就是说,视图不会继承集合的默认排序规则。

视图上的字符串比较使用视图的默认排序规则。尝试更改或覆盖视图的默认排序规则将会失败。如果从另一个视图创建视图,则无法指定与源视图不同的排序规则。如果执行涉及多个视图的聚合,如:使用$lookup或$graphLookup,则视图的排序规则须相同。

公共视图定义

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

删除视图

删除视图,使用以下方法

db.collection.drop()

修改视图

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

字段命名限制

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

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

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

索引限制

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
}