本章内容:
- 创建视图
- 视图特性
- 删除视图
- 修改视图
- 支持的操作
MongoDB视图是可查询的对象,视图内容由其他集合或视图的聚合管道定义。
MongoDB视图内容不会持久化到磁盘。
客户查询视图时,将按需计算视图的内容。
MongoDB可授权客户端查询视图的权限。
MongoDB不支持针对视图的写入操作。
例如,可以:
- 在员工数据集合上创建视图,该视图排除任何私人或隐私信息(PII)。应用程序可以在视图中查询不包含任何PII的员工数据。
- 在传感器收集数据的集合上创建一个视图,在视图中添加计算的字段和统计信息。应用程序可以使用简单的查找操作来查询数据。
- 创建一个视图,将分别包含库存和订单历史记录的两个集合连接起来。应用程序可以查询连接后的数据,而无需管理或了解底层的复杂管道。
当客户端查询视图时,MongoDB会将客户端查询附加到底层的管道,并将合并后的管道结果返回给客户端。 MongoDB可以将聚合管道优化应用于组合管道。
注意
本文主要讨论视图。有关按需实例化视图的讨论,请参见按需实例化视图。
一、创建视图
要创建一个视图:
- 使用db.createCollection()方法或create命令:
db.createCollection(
"<viewName>",
{
"viewOn" : "<source>",
"pipeline" : [<pipeline>],
"collation" : { <collation> }
}
)
- 使用db.createView()方法:
db.createView(
"<viewName>",
"<source>",
[<pipeline>],
{
"collation" : { <collation> }
}
)
注意
- 创建的视图必须与源集合在同一个数据库中。
- 视图定义管道不能包含$ out或$ merge阶段。如果视图定义包括嵌套管道(例如,视图定义包括$ lookup或$ facet阶段),则此限制也适用于嵌套管道。
二、视图特性
视图具有以下特点:
1.只读(Read Only)
视图是只读的;对视图的写操作将出错。
下面的读操作都支持视图:
- db.collection.find()
- db.collection.findOne()
- db.collection.aggregate()
- db.collection.countDocuments()
- db.collection.estimatedDocumentCount()
- db.collection.count()
- db.collection.distinct()
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对视图执行读取操作,这是基础聚合管道的一部分。因此,视图不支持以下操作:
- db.collection.mapReduce(),
- $ text运算,因为聚合中的$ text运算仅对第一阶段有效,
- $ geoNear管线阶段。
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 |
| |
| |
db.collection.countDocuments() |