MongoDB入门

MongoDB入门练习可通过在线MongoDB Atlas免费服务,了解MongoDB相关功能特性。

MongoDB Atlas集群

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

概念

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

mongodb databases and collections

命令

选择数据库

use myDB

建库

数据库若不存在,MongoDB会在该数据库第一次存储数据时创建,可用use命令切换到一个不存在的数据库,执行insert。

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

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

Collections

MongoDB将文档存储在集合中,类似于关系数据库的表。

默认集合不要求文档具有相同schema,也就是说,单个集合中的文档无需具有相同的字段集,而字段数据类型在集合的不同文档中也可以不同。

从MongoDB 3.2开始,在更新和插入操作期间,可强制执行集合的文档验证

隐式创建

集合若不存在,在该集合第一次存储数据时创建。

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存储引擎不受此限制。

视图

视图是只读行为,对视图执行写操作会报错。

视图使用基础集合的索引,由于索引位于基础集合上,无法直接在视图上创建、删除、重新构建索引。

无法在视图上获取索引列表。

也无法$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类型索引项可能包含结构开销。

若现有文档的索引条目超过索引限制,将不会在集合上创建索引。

早期版本会创建索引,但不会索引这样的文档。

若索引字段的索引项超过索引键限制,重建索引操作将出错。

重建索引操作作为compactrepair命令及db.collection.reIndex()方法的一部分执行。

由于这些操作是从集合中删除索引,然后,按顺序重建。

因此,索引键限制抛出的错误,会阻止集合中剩余索引的重建工作,repairDatabase命令,也会阻止该过程的后续部分。

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
}