1,视图(View)

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

2,创建视图语法

db.createCollection("<viewName>",{"viewOn" : "<source>","pipeline" : [<pipeline>],"collation" : { <collation> }}
);或db.createView("<viewName>","<source>",[<pipeline>],{"collation" : { <collation> }}
);ps: 必须在与源集合相同的数据库中创建视图。

3,视图特点

只读

视图是只读;对视图的写操作将出错。支持如下只读操作:
db.collection.find()
db.collection.findOne()
db.collection.aggregate()
db.collection.countDocuments()
db.collection.estimatedDocumentCount()
db.collection.count()
db.collection.distinct()

索引使用和排序操作

视图使用基础集合的索引。
由于索引位于基础集合上,您不能直接在视图上创建、删除或重新构建索引,也不能在视图上获得索引列表
从MongoDB 4.4开始,您可以在视图上运行查找命令时指定$natural排序。MongoDB以前的版本不支持视图上的$natural排序。
视图的底层聚合管道受制于阻塞sort和阻塞group操作的100兆内存限制。从MongoDB 4.4开始,你可以在视图上发出一个allowDiskUse: true的find命令来允许MongoDB使用临时文件来阻塞sort和group操作。在MongoDB 4.4之前,只有aggregate命令接受allowDiskUse选项。

投影限制

视图上的find()操作不支持以下投影操作符:
$
$elemMatch
$slice
$meta

视图名字不变

不能重命名视图

创建视图

在读取操作期间,视图是按需计算的,MongoDB作为底层聚合管道的一部分对视图执行读取操作。因此,视图不支持以下操作:db.collection.mapReduce()$text操作符,因为聚合中的$text操作仅对第一阶段有效$geoNear管道阶段如果用于创建视图的聚合管道取消了_id字段,则视图中的文档没有_id字段。

分片视图

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

视图和排序

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

公共视图定义

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

4,删除视图

db.collection.drop();

5,修改视图

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

6,On-Demand Materialized Views(按需实现视图)

从4.2版开始,MongoDB为聚合管道添加了$merge阶段。此阶段可以将管道结果合并到现有集合,而不是完全替换该集合。此功能允许用户创建随需应变的实现视图,其中输出集合的内容可以在每次运行管道时更新
例子数据:
db.bakesales.insertMany( [{ date: new ISODate("2018-12-01"), item: "Cake - Chocolate", quantity: 2, amount: new NumberDecimal("60") },{ date: new ISODate("2018-12-02"), item: "Cake - Peanut Butter", quantity: 5, amount: new NumberDecimal("90") },{ date: new ISODate("2018-12-02"), item: "Cake - Red Velvet", quantity: 10, amount: new NumberDecimal("200") },{ date: new ISODate("2018-12-04"), item: "Cookies - Chocolate Chip", quantity: 20, amount: new NumberDecimal("80") },{ date: new ISODate("2018-12-04"), item: "Cake - Peanut Butter", quantity: 1, amount: new NumberDecimal("16") },{ date: new ISODate("2018-12-05"), item: "Pie - Key Lime", quantity: 3, amount: new NumberDecimal("60") },{ date: new ISODate("2019-01-25"), item: "Cake - Chocolate", quantity: 2, amount: new NumberDecimal("60") },{ date: new ISODate("2019-01-25"), item: "Cake - Peanut Butter", quantity: 1, amount: new NumberDecimal("16") },{ date: new ISODate("2019-01-26"), item: "Cake - Red Velvet", quantity: 5, amount: new NumberDecimal("100") },{ date: new ISODate("2019-01-26"), item: "Cookies - Chocolate Chip", quantity: 12, amount: new NumberDecimal("48") },{ date: new ISODate("2019-01-26"), item: "Cake - Carrot", quantity: 2, amount: new NumberDecimal("36") },{ date: new ISODate("2019-01-26"), item: "Cake - Red Velvet", quantity: 5, amount: new NumberDecimal("100") },{ date: new ISODate("2019-01-27"), item: "Pie - Chocolate Cream", quantity: 1, amount: new NumberDecimal("20") },{ date: new ISODate("2019-01-27"), item: "Cake - Peanut Butter", quantity: 5, amount: new NumberDecimal("80") },{ date: new ISODate("2019-01-27"), item: "Tarts - Apple", quantity: 3, amount: new NumberDecimal("12") },{ date: new ISODate("2019-01-27"), item: "Cookies - Chocolate Chip", quantity: 12, amount: new NumberDecimal("48") },{ date: new ISODate("2019-01-27"), item: "Cake - Carrot", quantity: 5, amount: new NumberDecimal("36") },{ date: new ISODate("2019-01-27"), item: "Cake - Red Velvet", quantity: 5, amount: new NumberDecimal("100") },{ date: new ISODate("2019-01-28"), item: "Cookies - Chocolate Chip", quantity: 20, amount: new NumberDecimal("80") },{ date: new ISODate("2019-01-28"), item: "Pie - Key Lime", quantity: 3, amount: new NumberDecimal("60") },{ date: new ISODate("2019-01-28"), item: "Cake - Red Velvet", quantity: 5, amount: new NumberDecimal("100") },
] );1,定义实现视图
updateMonthlySales = function(startDate) {db.bakesales.aggregate( [{ $match: { date: { $gte: startDate } } },{ $group: { _id: { $dateToString: { format: "%Y-%m", date: "$date" } }, sales_quantity: { $sum: "$quantity"}, sales_amount: { $sum: "$amount" } } },{ $merge: { into: "monthlybakesales", whenMatched: "replace" } }] );
};
说明:$match阶段过滤数据,只处理大于或等于startDate的销售额。$group阶段按年-月对销售信息进行分组$merge阶段将输出写入monthlybakesales集合根据_id字段(非分片输出集合的默认值),该阶段检查聚合结果中的文档是否与集合中的现有文档匹配:当有匹配时(即集合中已经存在一个年-月相同的文档),该阶段将使用聚合结果中的文档替换现有文档。当没有匹配时,stage将来自聚合结果的文档插入到集合中(不匹配时的默认行为)。
2,执行初始化
updateMonthlySales(new ISODate("1970-01-01"));
# 查询结果
db.monthlybakesales.find({}).sort({_id:1});
# 输出
{ "_id" : "2018-12", "sales_quantity" : 41, "sales_amount" : NumberDecimal("506") }
{ "_id" : "2019-01", "sales_quantity" : 86, "sales_amount" : NumberDecimal("896") }3,刷新实现视图
# 新增数据
db.bakesales.insertMany( [{ date: new ISODate("2019-01-28"), item: "Cake - Chocolate", quantity: 3, amount: new NumberDecimal("90") },{ date: new ISODate("2019-01-28"), item: "Cake - Peanut Butter", quantity: 2, amount: new NumberDecimal("32") },{ date: new ISODate("2019-01-30"), item: "Cake - Red Velvet", quantity: 1, amount: new NumberDecimal("20") },{ date: new ISODate("2019-01-30"), item: "Cookies - Chocolate Chip", quantity: 6, amount: new NumberDecimal("24") },{ date: new ISODate("2019-01-31"), item: "Pie - Key Lime", quantity: 2, amount: new NumberDecimal("40") },{ date: new ISODate("2019-01-31"), item: "Pie - Banana Cream", quantity: 2, amount: new NumberDecimal("40") },{ date: new ISODate("2019-02-01"), item: "Cake - Red Velvet", quantity: 5, amount: new NumberDecimal("100") },{ date: new ISODate("2019-02-01"), item: "Tarts - Apple", quantity: 2, amount: new NumberDecimal("8") },{ date: new ISODate("2019-02-02"), item: "Cake - Chocolate", quantity: 2, amount: new NumberDecimal("60") },{ date: new ISODate("2019-02-02"), item: "Cake - Peanut Butter", quantity: 1, amount: new NumberDecimal("16") },{ date: new ISODate("2019-02-03"), item: "Cake - Red Velvet", quantity: 5, amount: new NumberDecimal("100") }
] );
updateMonthlySales(new ISODate("2019-01-01"));
# 查询结果
db.monthlybakesales.find({}).sort({_id:1});
# 输出
{ "_id" : "2018-12", "sales_quantity" : 41, "sales_amount" : NumberDecimal("506") }
{ "_id" : "2019-01", "sales_quantity" : 102, "sales_amount" : NumberDecimal("1142") }
{ "_id" : "2019-02", "sales_quantity" : 15, "sales_amount" : NumberDecimal("284") }

12,MongoDB的视图相关推荐

  1. 用mongo实现mysql视图_浅谈 MongoDB 的视图

    2018 年 9 月 18 日,由 Robert Gravelle 撰写 在关系数据库中,视图是由查询定义的可搜索数据子集.视图有时被称为"虚拟表",因为它们不存储数据,但可以像表 ...

  2. 499、Java分布式和集群12 -【SpringCloud视图微服务 - 消息总线Bus】 2021.06.01

    目录 0.RabbitMQ 1.先运行,看到效果,再学习 2.pom.xml 3.bootstrap.yml 4.application.yml 5.ProductDataServiceApplica ...

  3. UG NX 12 设置定向视图

    用户在建模时,为便于观察视图中的模型状态,需要不时地进行视图的定向.UG视图的定向有8种,包括正三轴侧图.正等轴侧图.俯视图.前视图.右视图.左视图.后视图.仰视图等. 设置定向视图的工具命令如下图所 ...

  4. 12、动态视图组件ListView、GridView

    一.ListView的基本使用 ListVIEW显示内置QML类型(如ListModel)创建的模型数据,或者C++中自定义的模型类,这些模型类继承自QAbstractItemModel或QAbstr ...

  5. 12 MongoDB - 数据查询(消除重复)

    方法distinct()对数据进行去重 语法: db.集合名称.distinct('去重字段',{条件}) 例1:查找年龄大于18的性别(去重) db.stu.distinct('gender',{a ...

  6. mongodb 视图Views

    1.简介 从3.4开始,mongodb支持从现有的collection或view视图创建只读的视图的功能,类似关系型数据库的视图. 2.视图创建 db.runCommand({create:<v ...

  7. 时间序列数据和MongoDB:第三部分 - 查询,分析和呈现时间序列数据

    作者:Robert Walters 译者:刘东华 (Martin Liu) 在 时间序列数据和MongoDB中:第一部分 - 简介 我们回顾了您需要了解的关键问题,以了解数据库的查询访问模式.在 时间 ...

  8. mac mongodb可视化工具_「时序数据库」和MongoDB:第3部分-查询、分析和呈现

    在<时间序列数据和MongoDB:第1部分-简介>中,我们回顾了理解数据库的查询访问模式需要询问的关键问题.在<时间序列数据和MongoDB:第2部分-模式设计最佳实践>中,我 ...

  9. 使用 Node.js、Express、AngularJS 和 MongoDB 构建一个Web程序

    为什么80%的码农都做不了架构师?>>>    使用 Node.js.Express.AngularJS 和 MongoDB 构建一个实时问卷调查应用程序 2014 年 3 月 20 ...

最新文章

  1. What is Mahalanobis distance? 马氏距离
  2. 腾讯云工业互联网助力平台发布 推动制造业“数字化”蝶变
  3. SQLite在C#的使用
  4. 【必读】文案都写不好,还谈什么互联网思维
  5. 对 Vue 的理解(一)
  6. 解决svn:E200030: sqlite[S11]:database disk image is malformed
  7. C语言抽象类声明方法,抽象类 – 在C语言中隐藏实现
  8. 获取手机idfa_东风无力百花残 | IDFA留给开发者的时间不多了
  9. 83)PHP,配置文件功能
  10. C# GUID format参数说明
  11. Ubuntu 携手初创企业用代码开拓物联网
  12. Linux下网站搭建(2)---Mysql安装和基本操作
  13. atitit 解决教学记忆问题 压缩算法原理  哈夫曼 LZ77 gzip  zlib deflate算法.docx 目录 1. 压缩理论 1 1.1. 柯氏复杂性 1 2. 1 RLE 1
  14. netty银行账目管理系统_基于Java的银行帐目管理系统.doc
  15. springBoot17_缓存:环境搭建、原理、Cacheable、CachePut、CacheEvit、Caching、阿里云镜像加速、整合redis作为缓存、缓存原理、自定义缓存
  16. 小僧尽知他的备细出 水浒
  17. “犯强汉者,虽远必诛!”----遥想伟大汉人当年
  18. buck电路上下管_分时供电全桥Buck型双输入直流变换器
  19. 基于android的旅游app毕设,安卓157旅游记忆(app+server)
  20. iOS开发:2017苹果开发者账号申请流程

热门文章

  1. 树莓派之无屏幕下发现树莓派IP方法
  2. 关于川大667和972自命题考试的心得
  3. SSM框架搭建及项目实战
  4. 向windows服务器传输大文件时提示未知错误解决方法
  5. JSRPC: WebSocket报错 Refused to connect to ‘ws:<URL>/ws?group=testname=wangluozhe‘ because it violate
  6. MySQL查询优化系列文章
  7. 关于floor函数与ceil函数与round函数
  8. java毕业生设计弹幕视频网站计算机源码+系统+mysql+调试部署+lw
  9. App Store 审核被拒的各种原因
  10. Java:ActionListener接口