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命令来修改视图。
以下操作提供对视图的支持,但本页中提到的限制除外:
