MongoDB 限制和阈值
本文档提供了 MongoDB 系统的硬限制和软限制集合。除非另有说明,本页的限制适用于以下所有环境中托管的部署
MongoDB Atlas:云中 MongoDB 部署的全面管理服务
MongoDB Enterprise:基于订阅的、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用并可自我管理的 MongoDB 版本
MongoDB Atlas 限制
以下限制仅适用于在 MongoDB Atlas 中托管的部署。如果这些限制中的任何一项对您的组织构成问题,请联系 Atlas 支持。
MongoDB Atlas 集群限制
MongoDB Atlas连接限制和集群级别
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 部署,您只能访问您连接的同一云服务提供商中的节点。这个云服务提供商可能没有其区域中的主节点。当这种情况发生时,您必须在连接字符串中指定次要读取偏好模式以访问部署。
如果您需要通过当前云服务提供商通过私有连接访问您的多云 MongoDB Atlas 部署中的所有节点,您必须执行以下操作之一
在当前云服务提供商中为剩余的每个提供商配置 VPN。
为剩余的每个提供商配置 MongoDB Atlas 的私有端点。
MongoDB Atlas 集合和索引限制
尽管单个 MongoDB Atlas 集合中没有硬性限制集合数量,但如果集群服务于大量的集合和索引,其性能可能会下降。更大的集合对性能的影响更大。
MongoDB Atlas 集合层推荐的集合和索引最大总和数量如下
MongoDB Atlas集群级别 | 推荐最大值 |
---|---|
M10 | 5,000 个集合和索引 |
M20 / M30 | 10,000 个集合和索引 |
M40 /+ | 100,000 个集合和索引 |
MongoDB Atlas 组织和项目限制
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 服务账户每个mongodb atlas组织 | 200 |
访问列表条目每个mongodb atlas服务账户 | 200 |
秘密每个mongodb atlas服务账户 | 2 |
活动令牌每个mongodb atlas服务账户 | 100 |
MongoDB Atlas 标签限制
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 Atlas 命令限制
一些MongoDB命令在MongoDB Atlas中不受支持。此外,一些命令仅在MongoDB Atlas免费集群中受支持。了解更多信息,请参阅以下资源
BSON 文档
- BSON 文档大小
BSON 文档的最大大小为 16 兆字节。
最大文档大小有助于确保单个文档不会使用过多的 RAM,或者在网络传输时占用过多的带宽。为了存储大于最大大小的文档,MongoDB 提供了 GridFS API。有关 GridFS 的更多信息,请参阅
mongofiles
和您 驱动程序 的文档。
命名限制
- 数据库命名中大小写的使用
不要依赖于大小写来区分数据库。例如,你不能使用名为
salesData
和SalesData
的两个数据库。在MongoDB中创建数据库后,你必须在使用时保持一致的字母大小写。例如,如果你创建了
salesData
数据库,不要用其他大小写方式来引用它,如salesdata
或SalesData
。
- 集合名称的限制
集合名称应该以下划线或字母开头,并且不能
包含
$
。是空字符串(例如
""
)。包含空字符。
以
system.
前缀开始。(保留供内部使用。)包含
.system.
。
如果您的集合名称包含特殊字符,例如下划线字符,或以数字开头,则要访问该集合,请使用
db.getCollection()
方法在mongosh
或您驱动程序的类似方法。命名空间长度
未分片集合和视图的命名空间长度限制为255字节,分片集合为235字节。对于集合或视图,命名空间包括数据库名称、点(
.
)分隔符和集合/视图名称(例如<database>.<collection>
)。
命名警告
警告
请注意,本节讨论的问题可能会导致数据丢失或损坏。
MongoDB 不支持重复的字段名
MongoDB 查询语言不支持具有重复字段名的文档。尽管一些 BSON 构建器可能支持创建具有重复字段名的 BSON 文档,但即使插入成功,或看似成功,MongoDB 也不支持将此类文档插入数据库。例如,通过 MongoDB 驱动程序插入具有重复字段名的 BSON 文档可能会导致驱动程序在插入之前静默丢弃重复值,或者可能会导致插入一个包含重复字段的不有效文档。对这些文档的查询将导致任意和不一致的结果。
有关美元符号($
)和句点(.
)的导入和导出问题
从MongoDB 5.0版本开始,文档字段名可以以美元符号($
)开头,并可以包含句点(.
)。然而,在某些情况下,使用这些字符的字段名可能会导致mongoimport
和mongoexport
无法按预期工作。
MongoDB 扩展JSON v2无法区分类型包装器和与类型包装器同名字段。不要在可能包含美元符号($
)前缀键的相应BSON表示形式的上下文中使用扩展JSON格式。DBRef机制是这一通用规则的例外。
使用包含句点(.
)的字段名与mongoimport
和mongoexport
也有限制。由于CSV文件使用句点(.
)表示数据层次结构,字段名中的句点(.
)将被错误地解释为嵌套级别。
使用美元符号($
)和句点(.
)可能造成数据丢失
如果在MongoDB 5.0之前的旧服务器上使用未确认写入(写入关注 w=0
)与美元符号($
)前缀字段名或包含句点(.
)的字段名一起使用,则可能存在数据丢失的小风险。
在执行 insert
、update
和 findAndModify
命令时,与 5.0 兼容的驱动程序移除了使用以美元符号 ($
) 开头或包含点 (.
) 的字段名的文档的限制。这些字段名在早期驱动程序版本中会导致客户端错误。
移除限制不受驱动程序连接的服务器版本的影响。如果 5.0 驱动程序向旧服务器发送文档,该文档将被拒绝而不会发送错误。
命名空间
索引
- 具有2dsphere索引的字段只能存储几何形状
具有2dsphere索引的字段必须以坐标对或GeoJSON数据的形式存储几何数据。如果您尝试在
2dsphere
索引字段中插入非几何数据的文档,或者在具有非几何数据索引字段的集合上建立2dsphere
索引,操作将失败。
- 2dsphere索引键的数量有限
为了生成2dsphere索引的键,
mongod
将GeoJSON形状映射到内部表示形式。结果内部表示可能是一个包含大量值的数组。当
mongod
在包含数组的字段上生成索引键时,mongod
为每个数组元素生成一个索引键。对于复合索引,mongod
计算为每个字段生成的键集的笛卡尔积。如果两个集合都很大,那么计算笛卡尔积可能会导致操作超过内存限制。indexMaxNumGeneratedKeysPerDocument
限制单个文档生成的键的最大数量,以防止内存不足错误。默认值是每个文档100000个索引键。可以增加限制,但如果操作需要的键数超过indexMaxNumGeneratedKeysPerDocument
参数指定的值,操作将失败。
- 多键索引
多键索引不能覆盖数组字段的查询。
- 地理空间索引
地理空间索引不能覆盖查询。
- 索引构建中的内存使用
createIndexes
支持在集合上构建一个或多个索引。createIndexes
结合使用内存和磁盘上的临时文件来完成索引构建。默认情况下,createIndexes
的内存使用限制为200兆字节,由单个createIndexes
命令构建的所有索引共享。一旦内存限制达到,createIndexes
将使用--dbpath
目录下名为_tmp
的子目录中的临时磁盘文件来完成构建。您可以通过设置
maxIndexBuildMemoryUsageMegabytes
服务器参数来覆盖内存限制。设置更高的内存限制可能会加快索引构建的完成速度。然而,如果此限制相对于系统未使用的RAM过高,可能会导致内存耗尽和服务器关闭。对于 功能兼容性版本 (fcv)
"4.2"
及以后的版本,索引构建内存限制适用于所有索引构建。
索引构建可以由用户命令(如
createIndexes
)或管理过程(如 初始同步)触发。两者都受maxIndexBuildMemoryUsageMegabytes
设置的限制。初始同步只会一次填充一个集合,不会超过内存限制的风险。然而,用户可能在多个数据库中的多个集合上同时开始索引构建,可能消耗的内存量超过由
maxIndexBuildMemoryUsageMegabytes
设置的限制。提示
为了最小化在具有副本集分片的副本集和分片集群中构建索引的影响,请使用在 副本集上的滚动索引构建 中描述的滚动索引构建过程。
- 排序规则和索引类型
以下索引类型仅支持简单的二进制比较,不支持 排序规则:
提示
要在具有非简单排序规则的集合上创建
text
或2d
索引,必须在创建索引时显式指定{collation: {locale: "simple"} }
。
排序
数据
- 固定集合中文档的最大数量
如果您在
create
命令的max
参数中指定了限制集合中文档的最大数量,则该值必须小于231个文档。如果您在创建限制集合时未指定文档的最大数量,则没有文档数量的限制。
副本集
- 副本集投票成员数量
副本集最多可以有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。
- 分片集合中的单个文档修改操作
使用
update
和remove()
操作来修改指定了justOne
或multi: false
选项的分片集合如果只针对一个分片,可以在查询指定中使用部分分片键,或者
在查询指定中提供 分片键 或
_id
字段。
- 每个迁移范围中文档的最大数量
默认情况下,MongoDB无法移动范围,如果该范围内的文档数量大于配置的范围大小除以平均文档大小结果的2倍。如果MongoDB可以移动数据分片的一个子范围并将其大小减少到小于这个值,则通过迁移一个范围来实现,平衡器这样做。
db.collection.stats()
包括avgObjSize
字段,它表示集合中平均文档的大小。对于太大而无法迁移的数据分片:
平衡器设置
attemptToBalanceJumboChunks
允许平衡器迁移太大而无法移动的数据分片,只要这些数据分片没有标记为 巨型。有关详细信息,请参阅超出大小限制的平衡范围。在发出
moveRange
和moveChunk
命令时,可以指定 forceJumbo 选项,以允许迁移太大而无法移动的范围。这些范围可能被标记为 巨型,也可能不被标记。
分片键限制
- 分片键索引类型
分片键索引可以是分片键的升序索引,以分片键开始的复合索引,并指定分片键的升序,或者是一个 哈希索引。
分片键索引 不能是
操作
- 排序操作
如果 MongoDB 无法使用索引或索引来获取排序顺序,MongoDB 必须在数据上执行阻塞排序操作。该名称指的是
SORT
阶段在返回任何输出文档之前读取所有输入文档的要求,这会阻塞该特定查询的数据流。如果 MongoDB 需要使用超过 100 兆字节的系统内存来执行阻塞排序操作,MongoDB 将返回一个错误,除非 查询指定了
cursor.allowDiskUse()
。allowDiskUse()
允许 MongoDB 在处理阻塞排序操作时使用磁盘上的临时文件来存储超出 100 兆字节的系统内存限制的数据。有关排序和索引使用的更多信息,请参阅 排序和索引使用。
- 聚合管道内存
从MongoDB 6.0开始,
allowDiskUseByDefault
参数控制是否默认将需要超过100兆内存来执行的管道阶段写入磁盘上的临时文件。如果将
allowDiskUseByDefault
设置为true
,则默认情况下,需要超过100兆内存来执行的管道阶段将写入磁盘上的临时文件。您可以使用{ allowDiskUse: false }
选项禁用特定find
或aggregate
命令写入磁盘的临时文件。如果将
allowDiskUseByDefault
设置为false
,则默认情况下,需要超过100兆内存来执行的管道阶段将引发错误。您可以使用{ allowDiskUse: true }
选项为特定find
或aggregate
启用写入磁盘的临时文件。
$search
聚合阶段不受100兆RAM的限制,因为它在单独的进程中运行。当 allowDiskUse 为
true
时,可以写入磁盘的临时文件的阶段示例包括当索引不支持排序操作时,使用
$sort
注意
管道阶段对文档流进行操作,每个管道阶段接收文档,处理它们,然后输出结果文档。
某些阶段只能在处理完所有传入文档后才能输出任何文档。这些管道阶段必须在处理完所有传入文档之前将它们的阶段输出保留在RAM中。因此,这些管道阶段可能需要比100 MB的限制更多的空间。
- 聚合和读取关注
$out
阶段不能与读取关注"linearizable"
一起使用。如果您为"linearizable"
读取关注指定了db.collection.aggregate()
,则不能在管道中包含$out
阶段。在
$merge
阶段与"linearizable"
读取关注点不能一起使用。也就是说,如果您为db.collection.aggregate()
指定了"linearizable"
读取关注点,那么您不能在管道中包含$merge
阶段。
- GeoJSON多边形面积
对于
$geoIntersects
或$geoWithin
,如果您指定一个面积大于一个半球的单一环状多边形,请在$geometry
表达式中包含自定义的 MongoDB 坐标参考系统。否则,$geoIntersects
或$geoWithin
查询将针对互补几何体。对于所有面积大于半球的 GeoJSON 多边形,$geoIntersects
或$geoWithin
查询将针对互补几何体。
- 多文档事务
对于多文档事务:
您可以在事务中创建集合和索引。有关详情,请参阅在事务中创建集合和索引
事务中使用的集合可以位于不同的数据库中。
注意
您不能在跨分片写事务中创建新的集合。例如,如果您在一个分片中写入现有的集合并在另一个分片上隐式创建一个集合,MongoDB无法在同一个事务中执行这两个操作。
您不能写入固定集合。
当从固定集合中读取时,您不能使用读取关注点
"snapshot"
。(从MongoDB 5.0开始)您不能在
config
、admin
或local
数据库中对集合进行读写。您不能写入
system.*
集合。您不能使用
explain
或类似命令返回支持的操作的查询计划。
您不能将
killCursors
命令作为事务的第一个操作。此外,如果在事务中运行
killCursors
命令,服务器将立即停止指定的光标。它不会等待事务提交。
以下操作不允许在事务中执行
在跨分片写事务中创建新的集合。例如,如果您在一个分片中写入现有的集合并在另一个分片上隐式创建一个集合,MongoDB无法在同一个事务中执行这两个操作。
显式创建集合,例如使用
db.createCollection()
方法,以及索引,例如使用db.collection.createIndexes()
和db.collection.createIndex()
方法,当使用除"local"
之外的读取关注点级别时。listCollections
和listIndexes
命令及其辅助方法。其他非CRUD和非信息性操作,例如
createUser
、getParameter
、count
等及其辅助函数。
事务的生命周期限制由
transactionLifetimeLimitSeconds
指定。默认为60秒。
- 视图
视图定义的
pipeline
不能包含$out
或$merge
阶段。此限制也适用于嵌套管道,例如在$lookup
或$facet
阶段中使用的管道。视图有以下操作限制
视图是只读的。
不能重命名视图。
对视图的
find()
操作不支持以下查询和投影运算符视图不支持
$text
。视图不支持map-reduce操作。
- 投影限制
$
前缀字段路径限制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()
投影不能包含空字段名的投影。例如,以下操作是无效的在早期版本中,MongoDB 将空字段的包含/排除视为非现有字段的投影。db.inventory.find( { }, { "": 0 } ) - 路径冲突:嵌入式文档及其字段
- 您不能投影包含嵌入式文档的任何字段。例如,考虑一个包含具有
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
投影表达式作为$
投影表达式的一部分。例如,以下操作是无效的在之前的版本中,MongoDB 返回符合查询条件的db.inventory.find( { "instock.qty": { $gt: 25 } }, { "instock.$": { $slice: 1 } } ) 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驱动程序,请参阅 驱动程序文档 以获取创建会话的说明和语法。