【MongoDB】视图

本章内容:

  • 创建视图
  • 视图特性
  • 删除视图
  • 修改视图
  • 支持的操作

MongoDB视图是可查询的对象,视图内容由其他集合或视图的聚合管道定义。

MongoDB视图内容不会持久化到磁盘。

客户查询视图时,将按需计算视图的内容。

MongoDB可授权客户端查询视图的权限。

MongoDB不支持针对视图的写入操作。

例如,可以:

  • 在员工数据集合上创建视图,该视图排除任何私人或隐私信息(PII)。应用程序可以在视图中查询不包含任何PII的员工数据。
  • 在传感器收集数据的集合上创建一个视图,在视图中添加计算的字段和统计信息。应用程序可以使用简单的查找操作来查询数据。
  • 创建一个视图,将分别包含库存和订单历史记录的两个集合连接起来。应用程序可以查询连接后的数据,而无需管理或了解底层的复杂管道。

当客户端查询视图时,MongoDB会将客户端查询附加到底层的管道,并将合并后的管道结果返回给客户端。 MongoDB可以将聚合管道优化应用于组合管道。

注意

本文主要讨论视图。有关按需实例化视图的讨论,请参见按需实例化视图

 

一、创建视图

要创建一个视图:

db.createCollection(

  "<viewName>",

  {

    "viewOn" : "<source>",

    "pipeline" : [<pipeline>],

    "collation" : { <collation> }

  }

)
 
db.createView(

  "<viewName>",

  "<source>",

  [<pipeline>],

  {

    "collation" : { <collation> }

  }

)

注意

  • 创建的视图必须与源集合在同一个数据库中。
  • 视图定义管道不能包含$ out或$ merge阶段。如果视图定义包括嵌套管道(例如,视图定义包括$ lookup或$ facet阶段),则此限制也适用于嵌套管道。

二、视图特性

视图具有以下特点:

1.只读(Read Only)

视图是只读的;对视图的写操作将出错。

下面的读操作都支持视图:

2.索引和排序(Index Use and Sort Operations)

  • 视图使用底层集合的索引。
  • 由于索引在底层的集合上。因此,在视图上不能直接创建、删除或重建索引,也不能获取索引列表。
  • 从MongoDB 4.4开始,在视图上可以在运行find命令时指定$natural排序。MongoDB的早期版本不支持对视图进行自然排序。
  • 视图的底层聚合管道必须遵守100 MB的内存限制,才能执行阻塞排序和组操作。从MongoDB 4.4开始,可以在视图上发出带有allowDiskUse:true的find命令,以允许MongoDB使用临时文件来阻塞排序和组操作。

在MongoDB 4.4之前,仅聚合(aggregate)命令接受allowDiskUse选项。

有关阻塞排序操作内存限制的更多信息,请参见排序操作

 

3.投影限制(Projection Restrictions)

视图上的find()操作不支持如下的投影(projection)运算符:

 

4.视图名不可变(Immutable Name)

已经创建的视图,不能重命名。

 

5.视图的运行(View Creation)

   1. 视图是在读取操作期间按需计算的,并且MongoDB对视图执行读取操作,这是基础聚合管道的一部分。因此,视图不支持以下操作:

   2. 如果用于创建视图的聚合管道禁用了_id字段,则视图中的文档不会显示_id字段。

 

6.视图的分片(Sharded View)

如果视图的底层集合是分片的,则视图也是分片的。因此,无法在$ lookup$ graphLookup操作中为from字段指定分片视图。

 

7.视图和排序(Views and Collation)

  • 在创建视图时,可以指定默认排序规则。如果未指定排序规则,则视图的默认排序规则为“simple”二进制比较排序规则。也就是说,视图不会继承集合的默认排序规则
  • 字符串的比较使用视图的默认排序规则。要更改或覆盖视图的默认排序规则的操作将失败并显示错误。
  • 如果从另一个视图创建视图,则不能指定与源视图的排序规则不同的排序规则。
  • 如果涉及多个视图的聚合,例如使用$ lookup$ graphLookup,则这些视图必须具有相同的排序规则。

8.公开视图定义(Public View Definition)

查询集合列表的操作(例如db.getCollectionInfos()db.getCollectionNames()),在其输出中包括视图。

重要

视图定义是公开的; 即db.getCollectionInfos(),并说明对视图的操作将包括定义视图的管道。 因此,请避免在视图定义中直接引用敏感字段和值

 

三、删除视图

在视图上使用db.collection.drop()方法就可以删除视图。

 

四、修改视图

可通下面方式过来修改视图:

  • 删除并重新创建视图,或者
  • collMod命令。
db.runCommand( { collMod: <collection or view>, <option1>: <value1>, <option2>: <value2> ... } )

 

五、支持的操作

下面的操作均支持视图,但本文中提到的限制除外:

Commands

Methods

create

db.createCollection()

db.createView()

collMod

 

 

db.getCollection()

db.getCollectionInfos()

db.getCollectionNames()

find

distinct

count

db.collection.aggregate()

db.collection.find()

db.collection.findOne()

db.collection.countDocuments()

db.collection.estimatedDocumentCount()

db.collection.count()

db.collection.distinct()

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值