本文档提供了MongoDB系统的硬性限制和软性限制。
BSON Document Size
¶BSON文档的最大大小为16 MB。
最大文档大小有助于确保单个文档不会使用过多的RAM或在传输过程中占用过多的带宽。要存储大于最大大小的文档,MongoDB提供了GridFS API。有关GridFS的更多信息,请参见mongofiles
和驱动程序的文档。
Database Name Case Sensitivity
¶由于数据库名称在MongoDB中不区分大小写,因此数据库名称不能仅因字符的大小写而不同。
Restrictions on Database Names for Windows
¶对于在Windows上运行的MongoDB部署,数据库名称不能包含以下任何字符:
数据库名称也不能包含空字符。
Restrictions on Database Names for Unix and Linux Systems
¶对于在Unix和Linux系统上运行的MongoDB部署,数据库名称不能包含以下任何字符:
数据库名称也不能包含空字符。
Length of Database Names
¶数据库名称不能为空,并且必须少于64个字符。
Restriction on Collection Names
¶集合名称应以下划线或字母字符开头,并且不能:
$
。""
)。system.
前缀开头。(保留供内部使用。)如果您的集合名称包含特殊字符(例如下划线字符)或以数字开头,则可以使用Shell中的db.getCollection()
方法
mongo
或驱动程序的类似方法来访问集合。
集合名称空间的最大长度为120个字节,其中包括数据库名称,点(.
)分隔符和集合名称(即
<database>.<collection>
)。
Restrictions on Field Names
¶字段名称不能包含null
字符。
顶级字段名称不能以美元符号($
)字符开头。
否则,从MongoDB 3.6开始,服务器允许存储包含点(即.
)和美元符号(即
$
)的字段名称。
重要
MongoDB查询语言不能总是有效地表达对字段名称包含这些字符的文档的查询(请参阅SERVER-30575)。
直到支持在查询语句中添加,使用$
和
.
不推荐在字段名称,而不是由官方MongoDB的驱动程序支持。
MongoDB不支持重复的字段名称
未对具有重复字段名称的文档定义MongoDB查询语言。BSON构建器可能支持使用重复的字段名称创建BSON文档。尽管BSON构建器可能不会抛出错误,但是即使插入成功,也不支持将这些文档插入MongoDB 。例如,通过MongoDB驱动程序插入具有重复字段名称的BSON文档可能会导致驱动程序在插入之前静默删除重复值。
Index Key Limit
¶在版本4.2中更改
从4.2版开始,MongoDB会删除for featureCompatibilityVersion(fCV)设置为或更高。Index Key
Limit
"4.2"
对于将fCV设置为"4.0"
或更早版本的MongoDB 2.6至MongoDB版本,索引条目的总大小必须小于
1024字节,其中包括取决于BSON类型的结构开销。
当应用:Index Key Limit
如果现有文档的索引条目超过,则MongoDB 不会在集合上创建索引。index key limit
如果索引字段的索引条目超过,则重新索引操作将出错。重新编制索引操作是
命令和方法的一部分。index key limit
compact
db.collection.reIndex()
由于这些操作会删除集合中的所有索引,然后按顺序重新创建它们,因此来自的错误会阻止这些操作为集合重建任何剩余的索引。index key limit
MongoDB不会将任何具有索引字段的文档插入到索引集合中,该文档的索引字段的对应索引条目将超过,而将返回错误。MongoDB的早期版本将插入但不会索引此类文档。index key limit
如果更新的值导致索引条目超过,则对索引字段的更新将出错。index key limit
如果现有文档包含其索引条目超过限制的索引字段,则导致该文档在磁盘上重新定位的任何更新都将出错。
mongorestore
并且mongoimport
不会插入包含索引字段的文档,该字段的对应索引条目将超过。index key limit
在MongoDB 2.6中,副本集的辅助成员将继续复制带有索引字段的文档,该字段的对应索引条目超过初始同步时的索引条目,但将在日志中显示警告。index key limit
次要成员还允许对包含索引字段的集合进行索引构建和重建操作,该索引字段的对应索引条目超过,但日志中带有警告。index key limit
对于辅助版本为2.6和主版本为2.4的混合版本副本集,辅助副本将复制在2.4主数据库上插入或更新的文档,但是如果文档包含索引字段的索引字段超过其对应的索引条目,则将在日志中显示错误消息的。index key limit
对于现有的分片集合,如果块中包含文档的索引条目超过的索引字段,则块迁移将失败。index key limit
Number of Indexes per Collection
¶单个集合可以有不超过64个指标。
Index Name Length
¶在版本4.2中更改
从4.2版开始,MongoDB会删除FeatureCompatibilityVersion(fCV)设置为
或更高的for MongoDB版本
。Index Name Length
Limit
"4.2"
在将fCV设置为"4.0"
或更早版本的MongoDB或MongoDB的早期版本中,包括名称空间和点分隔符(即)的标准索引名称不能超过127个字节。<database
name>.<collection name>.$<index name>
默认情况下,是字段名称和索引类型的串联。您可以显式指定to 方法,以确保标准索引名称不超过限制。<index name>
<index name>
createIndex()
Number of Indexed Fields in a Compound Index
¶复合索引中的字段不能超过32个。
Queries cannot use both text and Geospatial Indexes
¶您不能将$text
需要特殊文本索引的查询与需要其他类型的特殊索引的查询运算符组合在一起。例如,您不能将$text
查询与$near
运算符结合在一起。
Fields with 2dsphere Indexes can only hold Geometries
¶具有2dsphere索引的字段必须以坐标对
或GeoJSON数据的形式保存几何数据。如果您尝试在2dsphere
索引字段中插入包含非几何数据的文档,或者
2dsphere
在索引字段包含非几何数据的集合上建立索引,则该操作将失败。
NaN values returned from Covered Queries by the WiredTiger Storage Engine are always of type double
¶如果从索引覆盖的查询返回的字段的值是NaN
,则该NaN
值的类型始终为 double
。
Memory Usage in Index Builds
¶createIndexes
支持在集合上构建一个或多个索引。createIndexes
使用内存和磁盘上的临时文件的组合来完成索引构建。默认的内存使用限制createIndexes
为500 MB,由单个createIndexes
命令建立的所有索引之间共享。达到内存限制后,请createIndexes
在目录_tmp
内
名为的子目录中使用临时磁盘文件--dbpath
来完成构建。
您可以通过设置maxIndexBuildMemoryUsageMegabytes
服务器参数来覆盖内存限制
。设置更高的内存限制可能会导致更快完成大于500 MB的索引构建。但是,将此限制相对于系统上未使用的RAM设置得太高会导致内存错误。
在版本4.2中更改。
"4.2"
,索引构建内存限制适用于所有索引构建。"4.0"
,索引构建内存限制仅适用于前台索引构建。可以通过诸如“ 创建索引”之类的用户命令
或诸如“ 初始同步”之类的管理过程
来启动索引构建。两者均受设置的限制
maxIndexBuildMemoryUsageMegabytes
。
一个初始同步操作在同一时间只填充一个集合,并没有超出内存限制的风险。但是,用户可能会同时在多个数据库中的多个集合上启动索引构建,并且可能消耗的内存量大于中设置的限制maxIndexBuildMemoryUsageMegabytes
。
Collation and Index Types
¶以下索引类型仅支持简单的二进制比较,不支持排序规则:
小费
要创建一个text
,一个2d
,或者geoHaystack
对具有非简单归类的集合索引,你必须明确指定创建索引时。{collation: {locale: "simple"} }
Number of Members of a Replica Set
¶副本集最多可包含50个成员。
Maximum Size of Auto-Created Oplog
¶如果您未明确指定操作日志大小(即使用
oplogSizeMB
或--oplogSize
),则MongoDB将创建一个不超过50 GB的操作日志。[1]
[1] | 从MongoDB 4.0开始,操作日志可以超过其配置的大小限制,以避免删除。majority commit point |
分片群集具有此处描述的限制和阈值。
Covered Queries in Sharded Clusters
¶在MongoDB中3.0开始,索引不能覆盖在查询
分片的时候对一个运行集合
mongos
,如果指数不包含片键,除了具有以下不同的_id
指标:如果在分片集合的查询只规定了一个条件_id
字段,并且仅返回该_id
字段,即使该
字段不是分片键,_id
索引也可以覆盖针对mongos
该_id
字段的查询。
Sharding Existing Collection Data Size
¶如果现有集合的大小未超过特定限制,则只能对其进行分片。可以基于所有分片键值的平均大小以及配置的块大小来估计这些限制。
重要
这些限制仅适用于初始分片操作。成功启用分片后,分片集合可以增长到任何大小。
使用以下公式计算理论最大收集大小。
如果maxCollectionSize
小于或接近等于目标集合,则增加块大小以确保成功进行初始分片。如果对计算结果是否过于“接近”目标集合大小存有疑问,则最好增加块大小。
成功进行初始分片后,您可以根据需要减小块大小。如果以后减小块大小,则所有块可能都需要花费一些时间才能拆分为新的大小。请参阅 修改分片群集中的块大小以获取有关修改块大小的说明。
下表使用上述公式说明了最大的收集规模:
分片键值的平均大小 | 512字节 | 256字节 | 128字节 | 64字节 |
---|---|---|---|---|
最大分割数 | 32,768 | 65,536 | 131,072 | 262,144 |
最大收集大小(64 MB块大小) | 1 TB | 2 TB | 4 TB | 8 TB |
最大收集大小(128 MB块大小) | 2 TB | 4 TB | 8 TB | 16 TB |
最大收集大小(256 MB块大小) | 4 TB | 8 TB | 16 TB | 32 TB |
Single Document Modification Operations in Sharded Collections
¶所有update()
和remove()
运营的分片集合指定justOne
或选项必须包括
片键或将在查询规范场。
并且指定或
在分片集合中不包含分片
键或字段的操作将返回错误。multi: false
_id
update()
remove()
justOne
multi: false
_id
Unique Indexes in Sharded Collections
¶MongoDB不支持跨分片的唯一索引,除非唯一索引包含完整的分片键作为索引前缀。在这种情况下,MongoDB将在整个键而不是单个字段上强制唯一性。
看到
在任意字段上的唯一约束 是一种替代方法。
Maximum Number of Documents Per Chunk to Migrate
¶在版本3.4.11中进行了更改。
如果块中的文档数大于配置的块大小除以平均文档大小的结果的1.3倍,则MongoDB无法移动块
。
db.collection.stats()
包括avgObjSize
字段,该字段代表集合中的平均文档大小。
Shard Key Size
¶分片密钥不能超过512个字节。
Shard Key Selection is Immutable
¶分片集合后,分片键的选择是不变的。即,您不能为该集合选择其他分片键。
如果必须更改分片键:
Monotonically Increasing Shard Keys Can Limit Insert Throughput
¶对于具有高插入量的群集,具有单调递增和递减键的分片键会影响插入吞吐量。如果您的分片键是该_id
字段,请注意,这些_id
字段的默认值是通常具有递增值的ObjectId。
当与单调递增的碎片键插入文档,所有插入属于同一个块上的单个碎片。系统最终划分接收所有写操作的块范围,并迁移其内容以更均匀地分配数据。但是,群集在任何时候都将插入操作仅定向到单个分片,这会造成插入吞吐量瓶颈。
如果群集上的操作主要是读取操作和更新,则此限制可能不会影响群集。
为避免此约束,请使用哈希分片键或选择不会单调增加或减少的字段。
Sort Operations
¶如果MongoDB无法使用索引按请求的排序顺序获取文档,则排序操作中所有文档的总大小加上很小的开销必须小于32兆字节。
Aggregation Pipeline Operation
¶管道阶段的RAM限制为100 MiB(100 * 1024 * 1024字节)。如果阶段超出此限制,则MongoDB将产生错误。要允许处理大型数据集,可以在方法中设置
allowDiskUse选项
aggregate()
。该allowDiskUse选项允许最多聚集流水线作业将数据写入到一个临时文件。以下聚合操作是allowDiskUse选项的例外:这些操作必须在内存限制限制内:
$graphLookup
阶段$addToSet
该$group
阶段中使用的累加器表达式
(从4.2.3、4.0.14、3.6.17版开始)$push
该$group
阶段中使用的累加器表达式
(从4.2.3、4.0.14、3.6.17版开始)如果管道中包括在
操作中遵守allowDiskUse:true的其他阶段aggregate()
,则allowDiskUse:true选项对于这些其他阶段有效。
从MongoDB 4.2开始,事件探查器日志消息和诊断日志消息包括一个usedDisk
指示符,指示是否有任何聚合阶段由于内存限制而将数据写入临时文件。
也可以看看
Aggregation and Read Concern
¶$out
阶段不能与“关注”一起使用"linearizable"
。也就是说,如果您为指定了"linearizable"
读取关注
db.collection.aggregate()
,则不能将$out
阶段包括
在管道中。$merge
阶段不能与已关注的内容一起使用"linearizable"
。也就是说,如果您为指定了
"linearizable"
读取关注
db.collection.aggregate()
,则不能将$merge
阶段包括
在管道中。2d Geospatial queries cannot use the $or operator
¶Geospatial Queries
¶对于球形查询,请使用2dsphere
索引结果。
将2d
索引用于球形查询可能会导致错误的结果,例如将2d
索引用于环绕两极的球形查询。
Geospatial Coordinates
¶-180
和之间180
,包括两者之间。-90
和之间90
,包括在内。Area of GeoJSON Polygons
¶对于$geoIntersects
或$geoWithin
,如果您指定面积大于单个半球的单环多边形,则包含表达式;否则,或查询互补几何。对于面积大于半球的所有其他GeoJSON多边形,或查询互补几何。the
custom MongoDB coordinate reference system in the $geometry
$geoIntersects
$geoWithin
$geoIntersects
$geoWithin