MongoDB创建和查询视图
本文整理mongodb的官方文档,介绍mongodb的视图创建和查询。
Mongodb中,允许使用两种方式来创建视图。
限制和注意事项
创建视图时,要创建的视图需要与依赖的集合在同一个数据库。
在普通视图的定义的管道中中,不能出现$out和$merge过程。在$lookup或$facet过程中也不能出现$merge和$out。
视图创建后,不可以被重新命名,不可以修改视图名称。
视图中,不能够使用mapReduce(), $text, $geoNear等命令。
Mongodb查看集合的操作,如db.getCollectionInfos()和db.getCollectionNames()命令,结果集中会包含用户定义的视图信息。
视图的定义对用户是可见的,使用命令db.getCollectionInfos()或通过explain查询执行计划时,打印出来的信息会包含视图的定义信息。因此,用户需要在定义视图中避免直接引用敏感字段和字段值。
使用AtlasUI,用户只能创建物化视图。
使用find()命令查询视图中,不支持操作符$, $elemMatch, $slice, $meta
使用db.collection.find()方法查询视图时,filter, projection, sort, skip, limit等查询方法,转化成等价的集合管道查询方法。
Mongodb将客户端视图查询条件与视图定义中的管道操作一起进行查询优化
查询优化器不会改变视图的查询结果,只是重新编排管道中查询操作的顺序来提高效率。
使用db.createView()命令创建视图的过程中,会在依赖的集合上加锁。所有对该集合的操作需要等视图创建结束后才能执行。
创建视图的过程中,Mongodb会在system.view集合上加锁,当创建视图结束后,该锁才会被释放。
应用两种方式创建视图
构建一个student集合,用于创建视图
使用db.createView()创建一个视图,查询出一年级学生的数据
查询集合V_firstYears的数据
使用db.createCollection()方法创建一个查询毕业生的视图。
查询定义的毕业生视图。查询过程中,添加了按照学生姓名进行排序。定义视图时指定了按照大写字母优先的排序规则,则Harey排在前面。
删除视图,重新建立一个小写字母优先的字符序规则
查询新建的视图,返回结果与前面的排序结果不同。