当前位置:首页 > 技术分析 > 正文内容

mongodb——视图

ruisui882个月前 (04-15)技术分析27

MongoDB视图是一个可查询的对象,其内容由其他集合或视图上的聚合管道定义。MongoDB不会将视图内容持久化到磁盘。当客户端查询视图时,MongoDB可以要求客户端拥有查询视图的权限。MongoDB不支持针对视图的写操作。

例如,您可以:

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

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

接下来讨论视图。有关按需物化视图的讨论,请参阅按需物化视图。

创建视图

要创建或定义视图,请执行以下操作:

  • 使用db.createCollection()方法或create命令:
db.createCollection(
  "",
  {
    "viewOn" : "",
    "pipeline" : [],
    "collation" : {  }
  }
)
  • 使用db.createView()方法:
db.createView(
  "",
  "",
  [],
  {
    "collation" : {  }
  }
)

-您必须在与源集合相同的数据库中创建视图。

视图定义管道不能包括$out或$merge阶段。如果视图定义包括嵌套管道(例如,视图定义包括$lookup或$facet-stage),则此限制也适用于嵌套管道。

行为

视图表现出以下行为:

只读

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

以下读取操作可以支持视图:

  • db.collection.find()
  • db.collection.findOne()
  • db.collection.aggregate()
  • db.collection.countDocuments()
  • db.collection.estimatedDocumentCount()
  • db.collection.count()
  • db.collection.distinct()

索引使用和排序操作

  • 视图使用基础集合的索引。
  • 由于索引位于基础集合上,因此无法直接在视图上创建、删除或重新生成索引,也无法获取视图上的索引列表。
  • 从MongoDB 4.4开始,您可以在视图上运行find命令时指定$natural排序。MongoDB的早期版本不支持对视图进行$natural排序。
  • 视图的底层聚合管道受阻塞排序和阻塞组操作的100兆字节内存限制。从MongoDB 4.4开始,您可以在视图上发出一个带有allowDiskUse:true的find命令,允许MongoDB使用临时文件来阻塞排序和分组操作。
  • 在MongoDB 4.4之前,只有aggregate命令接受allowDiskUse选项。

另请参阅:

有关阻塞排序操作内存限制的详细信息,请参阅排序操作。

投影限制

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

  • $
  • $elemMatch
  • $slice
  • $meta

不可变名称

不能重命名视图。

视图创建

视图是在读取操作期间按需计算的,MongoDB作为底层聚合管道的一部分对视图执行读取操作。因此,视图不支持以下操作:

  • db.collection.mapReduce()
  • $text 运算符,因为聚合中的$text运算仅对第一阶段有效
  • $geo 管道阶段

如果用于创建视图的聚合管道取消显示_id字段,则视图中的文档没有_id字段。

查询视图时,将显示:

  • db.collection.find()的查询筛选、投影、排序、跳过、限制和其他操作被转换为等效的聚合管道阶段。
  • 转换后的聚合管道阶段将添加到视图的聚合管道的末尾。这不会修改视图的基础管道,该管道是在创建视图时设置的。
  • 聚合管道优化器重新调整视图聚合管道阶段以提高性能。这不会更改查询结果。

分片视图

如果视图的基础集合是分片的,则视图被视为分片的。因此,不能在$lookup和$graphLookup操作中为from字段指定分片视图。

视图和排序

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

公共视图定义

列出集合的操作,如db.getCollectionInfos()和db.getCollectionNames(),在其输出中包含视图。

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

删除视图

要删除视图,请对视图使用db.collection.drop()方法。

修改视图

您可以通过删除并重新创建视图或使用collMod命令来修改视图。

支持的操作

以下操作为视图提供支持,但本页中提到的限制除外:

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()

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/3478.html

分享给朋友:

“mongodb——视图” 的相关文章

Linux发行版Nobara更新39版本,号称“专为游戏玩家定制”

IT之家 12 月 27 日消息,Linux 发行版 Nobara 今天推出了 39 版本,主要改进了“Gamescope 合成器”,并更新了 OBS Studio、部分驱动程序及 Nautilus 文件管理器,小伙伴们可以点此访问项目地址。IT之家经过查询得知,Nobara 是一款基于 Fedor...

vue中组件之间的通信方式

** 1.1 父子组件**a. 父向子传数据: 第1种: 父通过属性传值,子组件通过props接收数据(注:props传过来的数据是单向的,不可以进行修改)第2种:子组件可以通过$parent来获取父组件里的数据和调用父组件的方法(注:数据是双向的,还要注意如用了UI组件并且在该UI组件里重新定义一...

迁移GIT仓库并带有历史提交记录

迁移git仓库开发在很多时候,会遇到一个问题。GIT仓库的管理,特别是仓库的迁移。我需要保留已有的历史记录,而不是重新开发,重头再来。我们可以这样做:使用--mirror模式会把本地的分支都克隆。// 先用--bare克隆裸仓库 git clone git@gitee.com:xxx/testApp...

K8S NFS 共享存储

NFS 共享存储前面我们学习了 hostPath 与 Local PV 两种本地存储方式,但是平时我们的应用更多的是无状态服务,可能会同时发布在不同的节点上,这个时候本地存储就不适用了,往往就需要使用到共享存储了,比如最简单常用的网络共享存储 NFS,本节课我们就来介绍下如何在 Kubernetes...

HTML5最新版本介绍

HTML5是HTML4.01和XHTML1.0之后超文本标记语言的最新版本,由一群自由思想者设计,最终实现了多媒体支持、交互性、更智能的表单和更好的语义标注。 HTML 5不只是 HTML规范的最新版本,它是用于生成现代 Web内容的一系列相关技术的总称,其中最重要的三个技术是:HTML5核心规范...

双子座应用程序推出模型切换器以在Android上访问2.0

#头条精品计划# 快速导读谷歌推出了Gemini 2.0 Flash实验版,现已在其安卓应用中可用,之前仅在gemini.google.com网站上提供。新版本的15.50包含模型切换器,用户可以在设置中选择不同模型,包括1.5 Pro、1.5 Flash和2.0 Flash实验版。谷歌提醒,2.0...