Docs 菜单
Docs 主页
/
MongoDB Manual
/ /

视图

在此页面上

  • 用例
  • 创建和管理视图
  • 与按需物化视图的对比
  • 行为
  • 访问控制

MongoDB 视图是一个只读的可查询对象,其内容由其他集合或视图上的 聚合管道定义。

MongoDB 不会在磁盘保存视图内容。视图内容将在客户端查询视图时按需计算得出。

注意

消歧

本页讨论标准视图。有关按需物化视图的讨论,请参阅按需物化视图。

要了解不同视图类型之间的区别,请参阅 与按需物化视图的比较

您可以使用视图执行以下操作:

要了解如何创建和管理视图,请参阅以下资源:

MongoDB 提供两种不同的视图类型:标准视图按需物化视图。这两种视图类型都可以返回聚合管道的结果。

  • 标准视图在您读取视图时计算得出,并且不会在磁盘中存储。

  • 按需物化视图存储在磁盘上并从磁盘读取。它们使用$merge$out阶段更新保存的数据。

    注意

    使用$merge时,可以使用变更流来监视物化视图的更改。 使用$out时,您无法监视物化视图上的更改。

标准视图使用底层集合的索引。因此,您无法直接在标准视图上创建、删除或重新构建索引,也无法获取视图上的索引列表。

您可以直接在按需物化视图上创建索引,因为它们存储在磁盘中。

按需物化视图的读取性能要优于标准视图,因为前者是从磁盘中读取,而不是作为查询的一部分通过计算得出。聚合管道越复杂,要聚合的数据量越大,这种性能优势就越明显。

以下各部分介绍了特定于视图的行为。

视图为只读。对视图进行写入操作会返回错误。

视图不维护集合更改的时间戳,也不支持时间点或快照读取隔离。

在执行阻塞排序和阻塞分组操作时,视图的基础聚合管道的内存限制为 100 MB 。

从 MongoDB 6.0 开始,需要 100 兆字节以上内存容量的管道阶段默认将临时文件写入磁盘。这些临时文件在管道执行期间持续存在,并且可能影响实例上的存储空间。在 MongoDB 的早期版本中,您必须将 { allowDiskUse: true } 传递给单个 findaggregate 命令才能启用此行为。

单个 findaggregate 命令可以通过以下任一方式覆盖 allowDiskUseByDefault 参数:

  • 使用 { allowDiskUse: true } 以允许在 allowDiskUseByDefault 设置为 false 时将临时文件写入磁盘

  • 使用 { allowDiskUse: false } 以禁止在 allowDiskUseByDefault 设置为 true 时将临时文件写入磁盘

注意

对于MongoDB Atlas,建议配置存储自动伸缩,以防止长时间运行的查询用临时文件填满存储。

如果您的Atlas 集群使用存储自动伸缩,则临时文件可能会导致集群扩展到下一个存储层级。

  • 时间序列集合是可写的非物化视图。视图限制适用于时间序列集合。有关更多信息,请参阅时间序列集合限制

  • 您无法从时间序列存储桶集合命名空间(即前缀为 system.buckets 的集合)创建视图。

警告

不要尝试创建名称为 system.profile 的时间序列集合或视图。如果您尝试这样做,MongoDB 6.3 及更高版本会返回 IllegalOperation 错误。早期 MongoDB 版本会因此崩溃。

如果部署强制执行身份验证:

  • 要创建视图,您必须对创建视图的数据库具有createCollection权限。此外,如果您对要创建的视图的命名空间拥有find权限,则还必须对以下资源拥有find权限:

  • 要查询视图,您必须拥有视图命名空间的find权限。您不需要对视图管道中引用的源集合或任何命名空间具有find权限。

对数据库具有内置readWrite角色的用户拥有运行所列操作所需的特权。要授予所需权限,请执行以下任一操作:

后退

数据库和collection