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> } } )
视图表现出以下行为:
视图是只读的;对视图进行写入操作将会报错。
以下读取操作可以支持视图:
db.collection.find()
db.collection.findOne()
db.collection.aggregate()
db.collection.countDocuments()
db.collection.estimatedDocumentCount()
db.collection.count()
db.collection.distinct()
查找
命令时指定$natural
排序。MongoDB的早期版本不支持$natural
视图排序。视图的基础聚合管道受 100 MB 内存限制的约束,用于阻止排序和阻止组操作。从MongoDB 4.4开始,您可以在视图上发出一个查找
命令,以允许MongoDB使用临时文件来阻止排序和组操作。allowDiskUse: true
聚合
命令接受了该选项。allowDiskUse
视图上的find()
操作不支持以下投影运算符:
$
$elemMatch
$slice
$meta
您无法重命名视图。
db.collection.mapReduce()
,$text
运算符,因为聚合中的操作仅对第一阶段有效,$text
$geoNear
管道阶段。_id_id
查询视图时,:
db.collection.find()
的查询、、、、、和其他操作将转换为等效的聚合管道阶段。filterprojectionsortskiplimit
如果视图的基础集合已分片,则视图被视为分片视图。因此,您无法在$lookup和$graphLookup
操作中为字段指定分片视图。 from
$lookup
或$graphLookup),
则视图必须具有相同的排序规则。列出集合的操作(如db.getCollectionInfos()
和db.getCollectionNames() )
在其输出中包含视图。
要删除视图,请在视图上使用db.collection.drop()
方法。
您可以通过删除并重新创建视图或使用collMod
命令来修改视图。
以下操作提供对视图的支持,但本页中提到的限制除外: