文档菜单
文档首页
/
MongoDB 手册
/

MongoDB 限制和阈值

在本页

  • MongoDB Atlas 限制
  • BSON 文档
  • 命名限制
  • 命名警告
  • 命名空间
  • 索引
  • 排序
  • 数据
  • 副本集
  • 分片集群
  • 操作
  • 会话

本文档提供了 MongoDB 系统的硬限制和软限制集合。除非另有说明,本页的限制适用于以下所有环境中托管的部署

  • MongoDB Atlas:云中 MongoDB 部署的全面管理服务

  • MongoDB Enterprise:基于订阅的、自我管理的 MongoDB 版本

  • MongoDB Community:源代码可用、免费使用并可自我管理的 MongoDB 版本

以下限制仅适用于在 MongoDB Atlas 中托管的部署。如果这些限制中的任何一项对您的组织构成问题,请联系 Atlas 支持。

组件
限制
多区域集群中的分片
12
单区域集群中的分片
50
多区域集群的跨区域网络权限(跨区域网络权限)
40. 此外,任何项目中的集群跨越40多个区域,您不能在该项目中创建跨区域的集群。
每个可选举节点或分片
7
集群级别适用于配置服务器(最小和最大)
M30

MongoDB Atlas根据集群级别和类别限制并发入站连接。MongoDB Atlas连接限制适用于每个节点。对于分片集群,MongoDB Atlas连接限制适用于每个mongos路由器。mongos路由器的数量等于所有分片中副本集节点的数量。

您的读取偏好也会影响MongoDB Atlas为特定查询分配的连接总数。

MongoDB Atlas针对指定的集群级别有以下连接限制

MongoDB Atlas集群级别
每个节点最大连接数
M0
500
M2
500
M5
500
M10
1500
M20
3000
M30
3000
M40
6000
M50
16000
M60
32000
M80
96000
M140
96000
M200
128000
M300
128000
MongoDB Atlas集群级别
每个节点最大连接数
M40
4000
M50
16000
M60
32000
M80
64000
M140
96000
M200
128000
M300
128000
M400
128000
M700
128000
MongoDB Atlas集群级别
每个节点最大连接数
M0
500
M2
500
M5
500
M10
1500
M20
3000
M30
3000
M40
6000
M50
16000
M60
32000
M80
64000
M140
96000
M200
128000
M300
128000

注意

MongoDB Atlas为支持MongoDB Atlas服务,为每个集群保留少量连接。

如果您通过私有连接连接到多云 MongoDB Atlas 部署,您只能访问您连接的同一云服务提供商中的节点。这个云服务提供商可能没有其区域中的主节点。当这种情况发生时,您必须在连接字符串中指定次要读取偏好模式以访问部署。

如果您需要通过当前云服务提供商通过私有连接访问您的多云 MongoDB Atlas 部署中的所有节点,您必须执行以下操作之一

  • 在当前云服务提供商中为剩余的每个提供商配置 VPN。

  • 为剩余的每个提供商配置 MongoDB Atlas 的私有端点

尽管单个 MongoDB Atlas 集合中没有硬性限制集合数量,但如果集群服务于大量的集合和索引,其性能可能会下降。更大的集合对性能的影响更大。

MongoDB Atlas 集合层推荐的集合和索引最大总和数量如下

MongoDB Atlas集群级别
推荐最大值
M10
5,000 个集合和索引
M20 / M30
10,000 个集合和索引
M40/+
100,000 个集合和索引

MongoDB Atlas 部署有以下组织和项目限制

组件
限制
数据库用户 每个MongoDB Atlas项目
100
Atlas用户 每个MongoDB Atlas项目
500
每个MongoDB Atlas组织中的Atlas用户
500
每个MongoDB Atlas组织中的API密钥
500
访问列表条目 每个MongoDB Atlas项目
200
每个MongoDB Atlas团队的用户
250
每个MongoDB Atlas项目的团队数量
100
每个MongoDB Atlas组织的团队数量
250
每个MongoDB Atlas用户的团队数量
100
每个MongoDB Atlas用户的组织数量
250
关联组织 每个跨组织配置
250
每个MongoDB Atlas项目的集群数量
25
每个MongoDB Atlas组织的项目数量
250
自定义MongoDB角色 每个MongoDB Atlas项目
100
分配给每个数据库用户的角色
100
每个MongoDB Atlas组织的每小时计费
$50
联邦数据库实例 每个MongoDB Atlas项目
25
每个MongoDB Atlas项目的总网络对等连接
另外,MongoDB Atlas 根据所选项目的CIDR块和区域,限制了每个网络对等连接的节点数量。
每个MongoDB Atlas项目的挂起网络对等连接
25
AWS Private Link 可访问的目标区域
50
Azure PrivateLink 可访问的目标区域
150
每个MongoDB Atlas管理的全局集群项目的唯一分片键
40。这仅适用于具有Atlas-Managed Sharding的全局集群。对于具有自管理分片的全局集群,每个项目的唯一分片键数量没有限制。
M0 集群每个MongoDB Atlas项目
1

mongodb atlas 服务账户具有以下组织和项目限制

组件
限制
mongodb atlas 服务账户每个mongodb atlas组织
200
访问列表条目每个mongodb atlas服务账户
200
秘密每个mongodb atlas服务账户
2
活动令牌每个mongodb atlas服务账户
100

mongodb atlas 对以下组件标签的长度和正则表达式要求进行限制

组件
字符限制
正则表达式模式
集群名称
64 [1]
^([a-zA-Z0-9]([a-zA-Z0-9-]){0,21}(?<!-)([\w]{0,42}))$ [2]
项目名称
64
^[\p{L}\p{N}\-_.(),:&@+']{1,64}$ [3]
组织名称
64
^[\p{L}\p{N}\-_.(),:&@+']{1,64}$ [3]
API密钥描述
250
[1] 如果您已启用仅对等模式,集群名称字符限制为23。
[2] mongodb atlas 使用集群名称的前23个字符。这些字符必须在集群的项目中是唯一的。少于23个字符的集群名称不能以连字符结束(-)。超过23个字符的集群名称不能将连字符作为第23个字符。
[3](1, 2) 组织和项目名称可以包含任何Unicode字母或数字以及以下标点符号: -_.(),:&@+'

MongoDB Atlas的无服务器实例、免费集群和共享集群还有一些其他限制。了解更多信息,请参阅以下资源

一些MongoDB命令在MongoDB Atlas中不受支持。此外,一些命令仅在MongoDB Atlas免费集群中受支持。了解更多信息,请参阅以下资源

BSON 文档大小

BSON 文档的最大大小为 16 兆字节。

最大文档大小有助于确保单个文档不会使用过多的 RAM,或者在网络传输时占用过多的带宽。为了存储大于最大大小的文档,MongoDB 提供了 GridFS API。有关 GridFS 的更多信息,请参阅 mongofiles 和您 驱动程序 的文档。

BSON 文档的嵌套深度

MongoDB 支持 BSON 文档最多 100 级嵌套。每个对象或数组增加一个层级。

数据库命名中大小写的使用

不要依赖于大小写来区分数据库。例如,你不能使用名为salesDataSalesData的两个数据库。

在MongoDB中创建数据库后,你必须在使用时保持一致的字母大小写。例如,如果你创建了salesData数据库,不要用其他大小写方式来引用它,如salesdataSalesData

Windows系统中数据库命名的限制

在Windows上运行的MongoDB部署中,数据库名称不能包含以下任何字符

/\. "$*<>:|?

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

Unix和Linux系统中数据库命名的限制

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

/\. "$

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

数据库名称长度

数据库名称不能为空,且长度必须小于64字节。

集合名称的限制

集合名称应该以下划线或字母开头,并且不能

  • 包含$

  • 是空字符串(例如"")。

  • 包含空字符。

  • system.前缀开始。(保留供内部使用。)

  • 包含.system.

如果您的集合名称包含特殊字符,例如下划线字符,或以数字开头,则要访问该集合,请使用db.getCollection()方法在mongosh或您驱动程序的类似方法。

命名空间长度

未分片集合和视图的命名空间长度限制为255字节,分片集合为235字节。对于集合或视图,命名空间包括数据库名称、点(.)分隔符和集合/视图名称(例如<database>.<collection>)。

字段名称限制
  • 字段名称 不能 包含空字符(null)。

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

  • MongoDB 5.0 增强了对字段名称中使用($)和(.)的支持。存在一些限制。有关更多详细信息,请参阅字段名称注意事项

  • 每个字段名称必须在文档中是唯一的。您不能存储具有重复字段的文档,因为如果文档具有重复字段,MongoDB CRUD 操作可能会出现意外的行为。

关于 _id 的限制

字段名称 _id 是作为主键使用的保留字段;其值必须在集合中是唯一的,是不可变的,并且可以是除数组或正则表达式之外的任何类型。如果 _id 包含子字段,则子字段名称不能以($)符号开头。

警告

请注意,本节讨论的问题可能会导致数据丢失或损坏。

MongoDB 查询语言不支持具有重复字段名的文档。尽管一些 BSON 构建器可能支持创建具有重复字段名的 BSON 文档,但即使插入成功,或看似成功,MongoDB 也不支持将此类文档插入数据库。例如,通过 MongoDB 驱动程序插入具有重复字段名的 BSON 文档可能会导致驱动程序在插入之前静默丢弃重复值,或者可能会导致插入一个包含重复字段的不有效文档。对这些文档的查询将导致任意和不一致的结果。

从MongoDB 5.0版本开始,文档字段名可以以美元符号($)开头,并可以包含句点(.)。然而,在某些情况下,使用这些字符的字段名可能会导致mongoimportmongoexport无法按预期工作。

MongoDB 扩展JSON v2无法区分类型包装器和与类型包装器同名字段。不要在可能包含美元符号($)前缀键的相应BSON表示形式的上下文中使用扩展JSON格式。DBRef机制是这一通用规则的例外。

使用包含句点(.)的字段名与mongoimportmongoexport也有限制。由于CSV文件使用句点(.)表示数据层次结构,字段名中的句点(.)将被错误地解释为嵌套级别。

如果在MongoDB 5.0之前的旧服务器上使用未确认写入(写入关注 w=0)与美元符号($)前缀字段名或包含句点(.)的字段名一起使用,则可能存在数据丢失的小风险。

在执行 insertupdatefindAndModify 命令时,与 5.0 兼容的驱动程序移除了使用以美元符号 ($) 开头或包含点 (.) 的字段名的文档的限制。这些字段名在早期驱动程序版本中会导致客户端错误。

移除限制不受驱动程序连接的服务器版本的影响。如果 5.0 驱动程序向旧服务器发送文档,该文档将被拒绝而不会发送错误。

命名空间长度

未分片集合和视图的命名空间长度限制为255字节,分片集合为235字节。对于集合或视图,命名空间包括数据库名称、点(.)分隔符和集合/视图名称(例如<database>.<collection>)。

提示

另请参阅

每个集合的索引数量

单个集合最多可以有64个索引。

复合索引中的索引字段数量

复合索引中最多可以有32个字段。

查询不能同时使用文本和地理空间索引

不能将$text查询,这需要特殊的文本索引,查询操作需要不同类型的特殊索引。例如,您不能将$text查询$near运算符结合。

具有2dsphere索引的字段只能存储几何形状

具有2dsphere索引的字段必须以坐标对GeoJSON数据的形式存储几何数据。如果您尝试在2dsphere索引字段中插入非几何数据的文档,或者在具有非几何数据索引字段的集合上建立2dsphere索引,操作将失败。

提示

另请参阅

唯一索引限制在分片操作限制。

2dsphere索引键的数量有限

为了生成2dsphere索引的键,mongodGeoJSON形状映射到内部表示形式。结果内部表示可能是一个包含大量值的数组。

mongod在包含数组的字段上生成索引键时,mongod为每个数组元素生成一个索引键。对于复合索引,mongod计算为每个字段生成的键集的笛卡尔积。如果两个集合都很大,那么计算笛卡尔积可能会导致操作超过内存限制。

indexMaxNumGeneratedKeysPerDocument限制单个文档生成的键的最大数量,以防止内存不足错误。默认值是每个文档100000个索引键。可以增加限制,但如果操作需要的键数超过indexMaxNumGeneratedKeysPerDocument参数指定的值,操作将失败。

来自WiredTiger存储引擎的Covered Queries返回的NaN值始终是double类型

如果一个由索引覆盖的查询返回的字段值是NaN,那么该NaN值的类型始终是double

多键索引

多键索引不能覆盖数组字段的查询。

地理空间索引

地理空间索引不能覆盖查询。

索引构建中的内存使用

createIndexes 支持在集合上构建一个或多个索引。 createIndexes 结合使用内存和磁盘上的临时文件来完成索引构建。默认情况下,createIndexes 的内存使用限制为200兆字节,由单个 createIndexes 命令构建的所有索引共享。一旦内存限制达到,createIndexes 将使用 --dbpath 目录下名为 _tmp 的子目录中的临时磁盘文件来完成构建。

您可以通过设置 maxIndexBuildMemoryUsageMegabytes 服务器参数来覆盖内存限制。设置更高的内存限制可能会加快索引构建的完成速度。然而,如果此限制相对于系统未使用的RAM过高,可能会导致内存耗尽和服务器关闭。

索引构建可以由用户命令(如 createIndexes)或管理过程(如 初始同步)触发。两者都受 maxIndexBuildMemoryUsageMegabytes 设置的限制。

初始同步只会一次填充一个集合,不会超过内存限制的风险。然而,用户可能在多个数据库中的多个集合上同时开始索引构建,可能消耗的内存量超过由 maxIndexBuildMemoryUsageMegabytes 设置的限制。

提示

为了最小化在具有副本集分片的副本集和分片集群中构建索引的影响,请使用在 副本集上的滚动索引构建 中描述的滚动索引构建过程。

排序规则和索引类型

以下索引类型仅支持简单的二进制比较,不支持 排序规则:

提示

要在具有非简单排序规则的集合上创建 text2d 索引,必须在创建索引时显式指定 {collation: {locale: "simple"} }

隐藏索引
最大排序键数量
  • 您可以在最多32个键上排序。

  • 提供具有重复字段的排序模式会导致错误。

固定集合中文档的最大数量

如果您在create命令的max参数中指定了限制集合中文档的最大数量,则该值必须小于231个文档。

如果您在创建限制集合时未指定文档的最大数量,则没有文档数量的限制。

副本集成员数量

副本集最多可以有50个成员。

副本集投票成员数量

副本集最多可以有7个投票成员。对于具有超过7个总成员的副本集,请参阅非投票成员。

自动创建的Oplog最大大小

如果您没有明确指定oplog的大小(即使用oplogSizeMB--oplogSize),MongoDB将创建一个不超过50GB的oplog。[4]

[4] oplog可以超过其配置的大小限制,以避免删除majority commit point

分片集群具有此处描述的限制和阈值。

在分片环境中不可用的操作

$where 不允许在 $where 函数中引用 db 对象。这在非分片集合中是不常见的。

geoSearch 命令不支持在分片环境中。

在 MongoDB 5.0 及更早版本中,您不能在 $lookup 阶段的 from 参数中指定 sharded collections

分片集群中的覆盖查询

mongos 上运行时,如果索引包含分片键,索引只能 覆盖 分片集合的查询。

分片集合中的单个文档修改操作

使用 updateremove() 操作来修改指定了 justOnemulti: false 选项的分片集合

  • 如果只针对一个分片,可以在查询指定中使用部分分片键,或者

  • 在查询指定中提供 分片键_id 字段。

分片集合中的唯一索引

MongoDB 不支持跨分片唯一索引,除非唯一索引包含索引的前缀作为完整的分片键。在这些情况下,MongoDB 将强制在整个键的范围内执行唯一性,而不是单个字段。

提示

请参阅

任意字段的唯一约束 了解其他方法。

每个迁移范围中文档的最大数量

默认情况下,MongoDB无法移动范围,如果该范围内的文档数量大于配置的范围大小除以平均文档大小结果的2倍。如果MongoDB可以移动数据分片的一个子范围并将其大小减少到小于这个值,则通过迁移一个范围来实现,平衡器这样做。 db.collection.stats() 包括 avgObjSize 字段,它表示集合中平均文档的大小。

对于太大而无法迁移的数据分片:

  • 平衡器设置 attemptToBalanceJumboChunks 允许平衡器迁移太大而无法移动的数据分片,只要这些数据分片没有标记为 巨型。有关详细信息,请参阅超出大小限制的平衡范围

    在发出 moveRangemoveChunk 命令时,可以指定 forceJumbo 选项,以允许迁移太大而无法移动的范围。这些范围可能被标记为 巨型,也可能不被标记。

分片键索引类型

分片键索引可以是分片键的升序索引,以分片键开始的复合索引,并指定分片键的升序,或者是一个 哈希索引

分片键索引 不能是

分片键选择

您更改分片键的选项取决于您正在运行的 MongoDB 版本

  • 从 MongoDB 5.0 开始,您可以通过更改文档的分片键来重新分片集合

  • 您可以通过向现有分片键添加后缀字段或字段来细化分片键

单调递增的分片键可能会限制插入吞吐量

对于具有高插入量的集群,单调递增和递减的分片键可能会影响插入吞吐量。如果您的分片键是 _id 字段,请注意 _id 字段的默认值是 ObjectIds,它们通常具有递增的值。

当插入具有单调递增分片键的文档时,所有插入都位于单个 数据分片 上。系统最终将接收所有写入操作的数据分片范围进行划分,并将内容迁移以更均匀地分布数据。然而,在任何时候,集群都将插入操作仅定向到单个数据分片,这会创建一个插入吞吐量瓶颈。

如果集群上的操作主要是读取操作和更新操作,则此限制可能不会影响集群。

为了避免此限制,请使用 哈希分片键 或选择不单调增加或减少的字段。

哈希分片键哈希索引 存储有升序值的键的哈希值。

排序操作

如果 MongoDB 无法使用索引或索引来获取排序顺序,MongoDB 必须在数据上执行阻塞排序操作。该名称指的是 SORT 阶段在返回任何输出文档之前读取所有输入文档的要求,这会阻塞该特定查询的数据流。

如果 MongoDB 需要使用超过 100 兆字节的系统内存来执行阻塞排序操作,MongoDB 将返回一个错误,除非 查询指定了 cursor.allowDiskUse()allowDiskUse() 允许 MongoDB 在处理阻塞排序操作时使用磁盘上的临时文件来存储超出 100 兆字节的系统内存限制的数据。

有关排序和索引使用的更多信息,请参阅 排序和索引使用。

聚合管道阶段

MongoDB对单个管道中允许的聚合管道阶段的数量限制为1000。

如果聚合管道在解析前后超出阶段限制,则会收到错误。

聚合管道内存

从MongoDB 6.0开始,allowDiskUseByDefault 参数控制是否默认将需要超过100兆内存来执行的管道阶段写入磁盘上的临时文件。

  • 如果将 allowDiskUseByDefault 设置为 true,则默认情况下,需要超过100兆内存来执行的管道阶段将写入磁盘上的临时文件。您可以使用 { allowDiskUse: false } 选项禁用特定 findaggregate 命令写入磁盘的临时文件。

  • 如果将 allowDiskUseByDefault 设置为 false,则默认情况下,需要超过100兆内存来执行的管道阶段将引发错误。您可以使用 { allowDiskUse: true } 选项为特定 findaggregate 启用写入磁盘的临时文件。

$search 聚合阶段不受100兆RAM的限制,因为它在单独的进程中运行。

allowDiskUsetrue 时,可以写入磁盘的临时文件的阶段示例包括

注意

管道阶段对文档流进行操作,每个管道阶段接收文档,处理它们,然后输出结果文档。

某些阶段只能在处理完所有传入文档后才能输出任何文档。这些管道阶段必须在处理完所有传入文档之前将它们的阶段输出保留在RAM中。因此,这些管道阶段可能需要比100 MB的限制更多的空间。

如果您的某个 $sort 管道阶段的输出超过限制,请考虑添加一个 限制阶段

当聚合阶段由于 内存限制 将数据写入临时文件时,分析器日志消息诊断日志消息 包含一个 usedDisk 指示器。

聚合和读取关注
2D 地理空间查询不能使用
地理空间查询

使用2D索引对球面数据进行查询可能会返回错误结果或错误。例如,2D索引不支持绕极地展开的球面查询。

地理坐标
  • 有效的经度值介于 -180180 之间,包含两端。

  • 有效的纬度值介于 -9090 之间,包含两端。

GeoJSON多边形面积

对于 $geoIntersects$geoWithin,如果您指定一个面积大于一个半球的单一环状多边形,请在 $geometry 表达式中包含自定义的 MongoDB 坐标参考系统。否则,$geoIntersects$geoWithin 查询将针对互补几何体。对于所有面积大于半球的 GeoJSON 多边形,$geoIntersects$geoWithin 查询将针对互补几何体。

多文档事务

对于多文档事务:

  • 您可以在事务中创建集合和索引。有关详情,请参阅在事务中创建集合和索引

  • 事务中使用的集合可以位于不同的数据库中。

    注意

    您不能在跨分片写事务中创建新的集合。例如,如果您在一个分片中写入现有的集合并在另一个分片上隐式创建一个集合,MongoDB无法在同一个事务中执行这两个操作。

  • 您不能写入固定集合

  • 当从固定集合中读取时,您不能使用读取关注点"snapshot"。(从MongoDB 5.0开始)

  • 您不能在configadminlocal数据库中对集合进行读写。

  • 您不能写入system.*集合。

  • 您不能使用explain或类似命令返回支持的操作的查询计划。

  • 对于在事务外创建的光标,您不能在事务内部调用getMore

  • 对于在事务中创建的光标,您不能在事务外调用getMore

  • 您不能将killCursors命令作为事务的第一个操作。

    此外,如果在事务中运行killCursors命令,服务器将立即停止指定的光标。它不会等待事务提交。

以下操作不允许在事务中执行

事务的生命周期限制由transactionLifetimeLimitSeconds指定。默认为60秒。

写入命令批量限制大小

单个批量操作允许在单个请求到服务器中执行100,000次写入。

Bulk()操作在mongosh和驱动程序中的类似方法没有此限制。

视图

视图定义的pipeline不能包含$out$merge阶段。此限制也适用于嵌套管道,例如在$lookup$facet阶段中使用的管道。

视图有以下操作限制

投影限制
$ 前缀字段路径限制
find()findAndModify() 投影不能投影以 $ 开头的字段,除了 DBRef 字段。例如,以下操作是无效的
db.inventory.find( {}, { "$instock.warehouse": 0, "$item": 0, "detail.$price": 1 } )
$ 位置运算符放置限制
$ 投影运算符只能出现在字段路径的末尾,例如 "field.$""fieldA.fieldB.$"例如,以下操作是无效的
db.inventory.find( { }, { "instock.$.qty": 1 } )
要解决,请移除字段路径中跟随 $ 投影运算符的部分。
空字段名投影限制
find()findAndModify() 投影不能包含空字段名的投影。例如,以下操作是无效的
db.inventory.find( { }, { "": 0 } )
在早期版本中,MongoDB 将空字段的包含/排除视为非现有字段的投影。
路径冲突:嵌入式文档及其字段
您不能投影包含嵌入式文档的任何字段。例如,考虑一个包含具有 size 字段的文档的集合 inventory
{ ..., size: { h: 10, w: 15.25, uom: "cm" }, ... }
以下操作因为尝试投影 size 文档和 size.uom 字段而失败,并显示 Path collision(路径冲突)错误
db.inventory.find( {}, { size: 1, "size.uom": 1 } )
在早期版本中,嵌入式文档及其字段之间的最后一个投影决定了投影
  • 如果嵌入式文档的投影在所有字段的投影之后,MongoDB 将投影嵌入式文档。例如,投影文档 { "size.uom": 1, size: 1 } 产生与投影文档 { size: 1 } 相同的结果。

  • 如果嵌入式文档的投影在字段投影之前,MongoDB 将投影指定的字段或字段。例如,投影文档 { "size.uom": 1, size: 1, "size.h": 1 } 产生与投影文档 { "size.uom": 1, "size.h": 1 } 相同的结果。

路径冲突:数组的 $slice 和嵌套字段
在 MongoDB 的 find()findAndModify() 操作中,投影不能同时包含数组的 $slice 和数组中嵌套的字段。例如,考虑一个包含数组字段 instock 的集合 inventory
{ ..., instock: [ { warehouse: "A", qty: 35 }, { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ], ... }
以下操作会因 Path collision 错误而失败
db.inventory.find( {}, { "instock": { $slice: 1 }, "instock.warehouse": 0 } )
在之前的版本中,投影同时应用两个投影,并在 instock 数组中返回第一个元素($slice: 1),但会抑制投影元素中的 warehouse 字段。从 MongoDB 4.4 版本开始,为了达到相同的结果,可以使用 db.collection.aggregate() 方法,并在其中使用两个独立的 $project 阶段。
位置操作符 $$slice 限制
在 MongoDB 的 find()findAndModify() 操作中,投影不能将 $slice 投影表达式作为 $ 投影表达式的一部分。例如,以下操作是无效的
db.inventory.find( { "instock.qty": { $gt: 25 } }, { "instock.$": { $slice: 1 } } )
在之前的版本中,MongoDB 返回符合查询条件的 instock 数组中的第一个元素(instock.$);即位置投影 "instock.$" 优先,$slice:1 是一个无操作。表达式 "instock.$": { $slice: 1 } 不会排除任何其他文档字段。
会话和外部用户名限制

要使用带有 客户端会话和因果一致性保证$external 身份验证用户(Kerberos、LDAP 或 x.509 用户),用户名不能超过 10k 字节。

会话空闲超时

30分钟内没有进行读写操作或未使用 refreshSessions 来刷新会话的会话将被标记为过期,MongoDB 服务器可以在任何时候关闭它们。关闭会话将终止与该会话关联的所有正在进行的操作和打开的游标。这包括配置了 noCursorTimeout() 或超过 30 分钟的 maxTimeMS() 的游标。

考虑一个发出 db.collection.find() 的应用程序。服务器返回一个游标和由 cursor.batchSize() 定义的文档批次的游标。会话在每次应用程序从服务器请求新的文档批次时刷新。但是,如果应用程序处理当前批次的时间超过 30 分钟,会话将被标记为过期并关闭。当应用程序请求下一批文档时,由于会话关闭时已终止游标,服务器返回错误。

对于返回游标的操作,如果游标可能空闲超过30分钟,请使用 Mongo.startSession() 在显式会话中执行操作,并使用 refreshSessions 命令定期刷新会话。例如

var session = db.getMongo().startSession()
var sessionId = session
sessionId // show the sessionId
var cursor = session.getDatabase("examples").getCollection("data").find().noCursorTimeout()
var refreshTimestamp = new Date() // take note of time at operation start
while (cursor.hasNext()) {
// Check if more than 5 minutes have passed since the last refresh
if ( (new Date()-refreshTimestamp)/1000 > 300 ) {
print("refreshing session")
db.adminCommand({"refreshSessions" : [sessionId]})
refreshTimestamp = new Date()
}
// process cursor normally
}

在示例操作中,db.collection.find() 方法与显式会话关联。游标配置为使用 noCursorTimeout() 以防止服务器在空闲时关闭游标。while 循环包含一个使用 refreshSessions 每5分钟刷新会话的块。由于会话永远不会超过30分钟的空闲超时,游标可以无限期地保持打开状态。

对于MongoDB驱动程序,请参阅 驱动程序文档 以获取创建会话的说明和语法。

返回

日志消息