参考 > 参考 > mongo Shell方法 > 数据库方法 > db.createView()
db.
createView
()¶注意
下页讨论视图。有关按需实例化视图的讨论,请参见$merge
。
创建视图作为应用指定的结果聚合管线到源集合或视图。视图充当只读集合,并在读取操作期间按需计算。您必须在与源集合相同的数据库中创建视图。MongoDB在基础聚合管道中对视图执行读取操作。
视图定义pipeline
不能包含$out
或$merge
阶段。如果视图定义包括嵌套管道(例如,视图定义包括
$lookup
或$facet
阶段),则此限制也适用于嵌套管道。
的db.createView
语法如下:
该方法接受以下参数:
参数 | 类型 | 描述 |
---|---|---|
view |
串 | 要创建的视图的名称。 |
source |
串 | 从中创建视图的源集合或视图的名称。名称不是集合或视图的完整名称空间;即不包含数据库名称,并且暗示与要创建的视图相同的数据库。您必须在与源集合相同的数据库中创建视图。 |
pipeline |
数组 | 由聚合管道阶段组成的数组。 视图定义 视图定义是公共的;即 |
options |
文献 | 可选的。该方法的其他选项。 |
选项文档包含以下选项字段:
领域 | 类型 | 描述 |
---|---|---|
collation |
文献 | 可选的。指定视图的默认排序规则。 归类允许用户为字符串比较指定特定于语言的规则,例如字母大写和重音符号的规则。 如果基础 如果未指定排序规则,则视图的默认排序规则是“简单”二进制比较排序规则。 如果基础 排序规则选项具有以下语法: 指定排序规则时,该 3.4版的新功能。 |
该db.createView()
方法包装以下
create
命令操作:
列出集合的操作(例如
db.getCollectionInfos()
和)
db.getCollectionNames()
在其输出中包括视图。
重要
视图定义是公共的;即db.getCollectionInfos()
,explain
对视图的操作将包括定义视图的管道。因此,请避免在视图定义中直接引用敏感字段和值。
若要删除视图,请使用视图上的drop()
方法。
视图表现出以下行为:
视图使用基础集合的索引。
由于索引位于基础集合上,因此您无法直接在视图上创建,删除或重建索引,也无法在视图上获取索引列表。
您不能$natural
在视图上指定排序。
例如,以下操作无效:
db.collection.mapReduce()
,$text
运算符,因为$text
聚合操作仅对第一阶段有效,$geoNear
管线阶段。_id
字段,则视图中的文档将没有该_id
字段。如果视图的基础集合被分片,则认为它们是分片的。因此,您不能from
在$lookup
和$graphLookup
操作中为该字段指定分片视图。
$lookup
或)$graphLookup
,则这些视图必须具有相同的排序规则。在版本4.2中进行了更改。
db.createView()
在操作期间获得对指定集合或视图的排他锁。集合上的所有后续操作都必须等到db.createView()
释放锁为止
。db.createView()
通常会短暂持有此锁。
创建视图需要system.views
在数据库中的集合上获得额外的排他锁。该锁将阻止在数据库中创建或修改视图,直到命令完成。
在MongoDB 4.2之前的版本中,db.createView()
获得了对父数据库的排他锁,从而阻止了对数据库及其
所有集合的所有操作,直到操作完成。
如果部署强制执行身份验证,则
db.createView()
要求已身份验证的用户具有createCollection
数据库特权。
但是,如果用户具有createCollection
在数据库和 find
视图上创建的权限,则该用户还必须
具有以下附加权限:
readWrite
在数据库上具有内置角色的用户具有运行列出的操作所需的特权。无论是
创建一个用户与所需的角色或角色授予现有用户
给定了survey
具有以下文件的集合:
以下操作创建一个managementFeedback
与视图_id
,feedback.management
和department
字段:
以下操作在managementFeedback
视图上执行聚合
,使用$sortByCount
将department
字段分组,然后按每个不同部门的计数以降序排序:
该操作返回以下文档: