小胖细说MongoDB特性 --- MongoDB ReadOnly View
在MongoDB 3.4中,喜大普奔的迎来了传统关系型数据库中的一个利器,视图。MongoDB为了做到与RDBMS无缝连接可谓是花了大心思了。
今天就为大家介绍一下MongoDB的新特性,Read-Only View
How to Create a View?
官方给出了3种途径供我们选择:
- 提供了runCommand接口供管理者进行调用
首先查看官方文档的描述:
用法比较简单,我们可以直接通过 db.runCommand({})
指令集的方式进行创建集合。
参数 | 说明 |
---|---|
<view> |
字符串。需要创建的集合名。 |
<source> |
字符串。来源于哪个集合或者哪个视图函数。这里填写的不是全名,只是集合名和函数名。 i.e 不需要填写类似test.myColl 这样子的集合名。 |
<pipeline> |
数组。由一组聚合指令集组合的数组。(关于更多聚合函数的使用,详见其他篇幅) |
- 对于需要指定默认的collation (关于更多collation的描述,详见其他篇幅),可以在runCommand中添加collation参数指定。
官方文档描述:
参数 | 说明 |
---|---|
<collation> |
字符串。3.4新特性---collation |
- 通过对runCommand函数的封装,直接采用db.createView的方式进行创建。
官方文档描述:
看得出,createView中的所有参数都是和上述保持一致,故此处不多做解释。
Behavior
Read-Only
也就是只读视图。需要强调的是,MongoDB的视图在3.4引入之处,目的是为了减少开发对于数据哭的直接数据操作。在读写分离的情况下,若要发起一个复杂查询,完全可以通过对View的操作获取返回结果集,而避免写出一大段可读性较差的代码。而视图的维护完全交由DBA维护。因此,在3.4中,视图函数是无法进行修改的,DBA一旦创立后,开发只管调用即可。Index Use and Sort Operation
会使用索引进行查询。View是依托于源集合的,这里不对源视图作说明的原因是源视图的源视图还是参照源集合的。因此VIew的创建规则中涉及到的查询,会如同在集合中进行一次普通查询一样,使用合适的索引。因此,在创建视图的时候一定要注意索引的及时创建,否则就会导致慢查询了。
另外需要注意的是,在使用视图函数的过程中,我们是无法使用$natural 进行自然排序的。(关于更多$natural排序,详见其他篇幅)Immutable Name
目前3.4版本支持的视图是无法进行重命名的。
因此,需要重命名的方法就是先drop再create。-
View Creation
部分指令集无法使用db.collection.mapReduce()
-
$text
,因为$text
操作符在聚合函数的第一个参数才有效 -
geoNear
和$geoNear
操作符 - 如果使用聚合函数创建的View中未加入_id的定义,则返回结果也不会有_id.
Sharded View
对于分片集来说,是可以创建View的,但是意义并不大,因为我们无法对他进行$lookup
的连表查询。
Get Views Info
我们可以通过db.getCollectionInfos()
的方法来获取关于该视图的所有信息。
由于视图是相对于集合来说公开的,因此只要有相应权限即可调用。通过该指令集可以看到集合的创建规则。
总结
3.4新加入的特性View是非常棒的。可以极大的帮助DBA去管理开发的复杂语句,减少大量慢查询的涌现。