本章内容:


  • 创建视图
  • 视图特性
  • 删除视图
  • 修改视图
  • 支持的操作


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

MongoDB视图内容不会持久化到磁盘。

客户查询视图时,将按需计算视图的内容。

MongoDB可授权客户端查询视图的权限。

MongoDB不支持针对视图的写入操作。

例如,可以:

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

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

注意

本文主要讨论视图。有关按需实例化视图的讨论,请参见按需实例化视图

 

一、创建视图

要创建一个视图:

db.createCollection(

  "<viewName>",

  {

    "viewOn" : "<source>",

    "pipeline" : [<pipeline>],

    "collation" : { <collation> }

  }

)


 


db.createView(

  "<viewName>",

  "<source>",

  [<pipeline>],

  {

    "collation" : { <collation> }

  }

)


注意



  • 创建的视图必须与源集合在同一个数据库中。
  • 视图定义管道不能包含$ out或$ merge阶段。如果视图定义包括嵌套管道(例如,视图定义包括$ lookup或$ facet阶段),则此限制也适用于嵌套管道。


二、视图特性

视图具有以下特点:

1.只读(Read Only)

视图是只读的;对视图的写操作将出错。

下面的读操作都支持视图:

2.索引和排序(Index Use and Sort Operations)

  • 视图使用底层集合的索引。
  • 由于索引在底层的集合上。因此,在视图上不能直接创建、删除或重建索引,也不能获取索引列表。
  • 从MongoDB 4.4开始,在视图上可以在运行find命令时指定$natural排序。MongoDB的早期版本不支持对视图进行自然排序。
  • 视图的底层聚合管道必须遵守100 MB的内存限制,才能执行阻塞排序和组操作。从MongoDB 4.4开始,可以在视图上发出带有allowDiskUse:true的find命令,以允许MongoDB使用临时文件来阻塞排序和组操作。

在MongoDB 4.4之前,仅聚合(aggregate)命令接受allowDiskUse选项。

有关阻塞排序操作内存限制的更多信息,请参见排序操作

 

3.投影限制(Projection Restrictions)

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

 

4.视图名不可变(Immutable Name)

已经创建的视图,不能重命名。

 

5.视图的运行(View Creation)

   1. 视图是在读取操作期间按需计算的,并且MongoDB对视图执行读取操作,这是基础聚合管道的一部分。因此,视图不支持以下操作:

   2. 如果用于创建视图的聚合管道禁用了_id字段,则视图中的文档不会显示_id字段。

 

6.视图的分片(Sharded View)

如果视图的底层集合是分片的,则视图也是分片的。因此,无法在$ lookup$ graphLookup操作中为from字段指定分片视图。

 

7.视图和排序(Views and Collation)

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

8.公开视图定义(Public View Definition)

查询集合列表的操作(例如db.getCollectionInfos()db.getCollectionNames()),在其输出中包括视图。


重要

视图定义是公开的; 即db.getCollectionInfos(),并说明对视图的操作将包括定义视图的管道。 因此,请避免在视图定义中直接引用敏感字段和值


 

三、删除视图

在视图上使用db.collection.drop()方法就可以删除视图。

 

四、修改视图

可通下面方式过来修改视图:

  • 删除并重新创建视图,或者
  • collMod命令。
db.runCommand( { collMod: <collection or view>, <option1>: <value1>, <option2>: <value2> ... } )

 


五、支持的操作

下面的操作均支持视图,但本文中提到的限制除外:

Commands

Methods

create

db.createCollection()

db.createView()

collMod

 

 

db.getCollection()

db.getCollectionInfos()

db.getCollectionNames()

find

distinct

count

db.collection.aggregate()

db.collection.find()

db.collection.findOne()

db.collection.countDocuments()

db.collection.estimatedDocumentCount()

db.collection.count()

db.collection.distinct()