以下内容是有关MongoDB的单个集合在硬件和软件上的限制。
BSON文档
单个Bson文档最大为16M。该限制是为了保证单个文档不会占用过多RAM、在网络传输过程中不会占用过多带宽。MongoDB提供了GridFS来保存超过该限制的文档。具体可参考mongofiles。
Bson文档的最深内嵌深度为100。
命名空间(namespaces)
每个命名空间长度必须小于123 bytes。
命名空间的数量为命名空间文件大小(字节数)/628。一个16M的命名空间文件可以保存大约24000个命名空间。每一个集合和索引都是一个命名空间
命名空间文件大小必须小于2047M,默认为16M,可以使用nsSize属性配置。
索引
索引键限制
索引条目的大小不得超过1024bytes。
2.6版本对索引的其他限制
如果现有文档的索引条目超过索引键限制,MongoDB 不会在一个集合上创建索引。以前版本将创建索引,但不能检索些文档。
如果索引的字段的索引条目超过索引键限制,重建索引将出错。compact和repairDatabase命令以及db.collection.reIndex()方法都会重建索引。因为这些操作将会从集合中删除所有索引,然后按顺序重新创建它们,索引键限制的错误将会阻止这些操作的重建任何剩余需要创建的索引;不过repairDatabase 命令会忽略这些错误,继续执行除创建索引之外的其他操作。
如果MongoDB试图往已经超过索引键的集合内插入数据,则报错。以前版本仍会插入成功但不会被索引检索。
对已经建索引的字段进行修改操作,如果修改后的值导致索引条目超过限制则报错。
mongorestore和mongoimport也不能对索引键超过限制的集合进行插入操作。
在该版本中,复制集的从节点仍然可以复制文档,即使该文档的索引键已经超出限制,不过会打印警告信息日志。也能够对超过索引键限制的集合继续建索引和重建索引,不过会打印警告信息日志。
对于已经分片的集合,如果索引已经超过索引键限制,那么块合并操作将会失败。
每个集合的索引数量限制
单个集合的索引数量不得超过64个。
索引名称长度限制
索引的完全限定名,包括命名空间和点操作符的长度不得超过128字符。索引名称格式:
复合索引字段数量限制
至多能同时对31个字段建复合索引。
数据
在创建集合时,如果指定集合大小(使用max属性指定,max必须小于2的32次幂),那么集合则为固定集合(capped collection),即capped collection的文档数最大为max。如果没有指定集合大小,理论上讲集合中文档数量无上限。
数据大小
一个单一的 mongod 实例无法管理超过由底层操作系统提供的最大虚拟内存地址空间的数据集。
虚拟内存限制
操作系统 |
记录日志 |
不记录日志 |
Linux |
64T |
128T |
Windows Server 2012 R2 and Windows 8.1 |
64T |
128T |
Windows (otherwise) |
4T |
8T |
数据库集合数量
集合在一个数据库中的最大数目是命名空间的文件和数据库中的集合的索引的数目大小的函数。
复制集
复制集成员数量
复制集成员个数最多12个。
具有表决权的复制集成员数量
在需要表决时,至多7个成员有表决权。
自动创建的oplog的大小
如果没有主动指定oplog大小,MongoDB创建的oplog不得超过50G。
分片集群
分片操作限制
group聚合操作不能用在分片集群环境上,如果需要聚合功能,需要用mapReduce和aggregate代替。
$isolated、db.eavl()、$snapshot、geoSearch命令都不支持在分片环境。
$where操作不支持嵌套。
索引覆盖查询
分片环境下不支持索引覆盖查询。
对已存在的集合数据进行分片
对于已经存在数据的集合,在其大小小于256G之前都支持分片操作。
对分片集合的单文档的更新操作
对分片集合的所有update()和remove(),在指定了justOne或者multi:false属性后查询条件必须包含片键字段或者或者_id字段。
分片集合的唯一性索引
MongoDB不支持分片集合的唯一性索引,除非以完整的片键作为索引的前缀。这种情况下的索引就是全局唯一性索引。
能够合并的块的文档数限制
如果一个块的文档数超过250000个或者超过块大小的1.3倍,那么该块将无法移动。
片键限制
片键大小
片键大小不得超过512bytes。
片键索引类型
片键索引可以是升序索引,以片键开始的复合升序索引或者哈希索引。
片键索引不能是multikey index,text index或者geospatial index。
片键不可改变
在分片之后片键不允许更改。
如果必须更改片键则需要:
dump所有数据
drop原始片键集合
使用新的片键配置分片
划分片键范围(制定分片规则)
重新导入数据
片键值不可更改
一旦集合分片成功,则片键的值都是不允许修改的。
单调性的分片键可以限制插入的吞吐量
对于需要频繁插入的集群,片键的单调递增或递减能够影响插入的吞吐量。如果你的分片键是 _id 字段,请注意 _id 字段的默认值是 ObjectIds 具有普遍增加值。
当插入带有单调递增或递减片键的文档时,所有的插入操作都将在一个分片的一个块上执行。插入完成后系统将会分割块并迁移数据以保证数据的均匀性分布。
如果该集群上的热点操作时修改和读取数据,则该限制不会影响集群。
为了避免这个问题,使用哈希片键或者选择的片键值不是单调性。
操作符
文档排序
对没有建索引的字段,如果排序阶段产生的结果集大于32M则报错。
聚合管道操作
管道各个阶段的内存使用不能超过100M。如果进行大数据聚合操作可以将属性allowDiskUse设置成true。
写命令操作的数据大小限制
写命令不能大于1000个操作,MongoDB的Bulk()操作和驱动程序中比较相关的函数没有该限制。
命名限制
数据库名称区分大小写
数据库名称区分大小写
Windows操作系统上数据库名称限制
名称不得包含以下字符
/\. "*<>:|?和空字符
Unix或Linux操作系统上数据库名称限制
名称不得包含以下字符
/\. "和空字符
数据库命令长度
长度不能超过64个字符
集合名称限制
集合名称必须以_和字符开头,不能包含$、空字符,不能以system.开头。
字段名称限制
字段名称不能包含.$空字符