MongoDB 视图


MongoDB 视图是一个可查询的对象,其内容由其他集合或视图上的聚合管道定义。MongoDB不会将视图内容保存到磁盘。当客户端查询视图时,将按需计算视图的内容。MongoDB可以要求客户端具有查询视图的权限。MongoDB不支持针对视图的写入操作。

例如,您可以:

  • 创建员工数据收集的视图,以排除任何私人或个人信息 (PII)。应用程序可以在视图中查询不包含任何 PII 的员工数据。
  • 在收集的传感器数据集合上创建视图,以添加计算字段和指标。应用程序可以使用简单的查找操作来查询数据。
  • 创建一个视图,该视图将分别包含库存和订单历史记录两个集合联接在一起。应用程序可以查询联接的数据,而无需管理或了解基础复杂管道。

当客户端查询视图时,MongoDB会将客户端查询附加到底层管道,并将该组合管道的结果返回给客户端。MongoDB可能会将聚合管道优化应用于组合的管道。

1 创建视图

创建或定义视图:

  • 使用db.createCollection()方法或create命令:
 db.createCollection(
  "<viewName>",
  {
    "viewOn" : "<source>",
    "pipeline" : [<pipeline>],
    "collation" : { <collation> }
  }
)

使用db.createView()方法:

db.createView(
  "<viewName>",
  "<source>",
  [<pipeline>],
  {
    "collation" : { <collation> }
  }
)

2 行为

视图表现出以下行为:

只读

视图是只读的;对视图进行写入操作将会报错。

以下读取操作可以支持视图:

  • db.collection.find()
  • db.collection.findOne()
  • db.collection.aggregate()
  • db.collection.countDocuments()
  • db.collection.estimatedDocumentCount()
  • db.collection.count()
  • db.collection.distinct()

索引使用和排序操作

  • 视图使用基础集合的索引。
  • 由于索引位于基础集合上,因此不能直接在视图上创建、删除或重新生成索引,也不能在视图上获取索引列表。
  • 从MongoDB 4.4开始,您可以在视图上运行查找命令时指定$natural排序。MongoDB的早期版本不支持$natural视图排序。

视图的基础聚合管道受 100 MB 内存限制的约束,用于阻止排序和阻止组操作。从MongoDB 4.4开始,您可以在视图上发出一个查找命令,以允许MongoDB使用临时文件来阻止排序和组操作。allowDiskUse: true

  • 在MongoDB 4.4之前,只有聚合命令接受了该选项。allowDiskUse

投影限制

视图上的find()操作不支持以下投影运算符:

  • $
  • $elemMatch
  • $slice
  • $meta

不可变名称

您无法重命名视图

视图创建

  • 视图在读取操作期间按需计算,MongoDB作为底层聚合管道的一部分对视图执行读取操作。因此,视图不支持以下操作:
    • db.collection.mapReduce()
    • $text运算符,因为聚合中的操作仅对第一阶段有效,$text
    • $geoNear管道阶段。
  • 如果用于创建视图的聚合管道禁止显示字段,则视图中的文档没有该字段。_id_id

查询视图时,:

  • db.collection.find()的查询、、、、、和其他操作将转换为等效的聚合管道阶段filterprojectionsortskiplimit
  • 转换后的聚合管道阶段将添加到视图的聚合管道的末尾。这不会修改视图的基础管道,该管道是在创建视图时设置的。
  • 聚合管道优化器可重塑视图聚合管道阶段以提高性能。这不会更改查询结果。

分片视图

如果视图的基础集合已分片,则视图被视为分片视图。因此,您无法在$lookup和$graphLookup操作中为字段指定分片视图。 from

视图和排序规则

  • 您可以在创建时为视图指定默认排序规则。如果未指定排序规则,则视图的默认排序规则是”简单”二进制比较排序规则。也就是说,视图不会继承集合的默认排序规则。
  • 视图上的字符串比较使用视图的默认排序规则。尝试更改或覆盖视图的默认排序规则的操作将失败并显示错误。
  • 如果从另一个视图创建视图,则不能指定与源视图的排序规则不同的排序规则。
  • 如果执行涉及多个视图的聚合(例如使用$lookup$graphLookup),则视图必须具有相同的排序规则

公共视图定义

列出集合的操作(如db.getCollectionInfos()db.getCollectionNames() )在其输出中包含视图。

3 放置视图

要删除视图,请在视图上使用db.collection.drop()方法。

4 修改视图

您可以通过删除并重新创建视图或使用collMod命令来修改视图。

5 支持的操作

以下操作提供对视图的支持,但本页中提到的限制除外:

Mongo视图,创建视图,定义视图