目录
一、MongoDB视图的概述
- 一、MongoDB视图的概述
- 二、MongoDB视图的作用
- 三、数据准备
- 四、创建视图
- 4.1、创建视图的基本语法格式
- 4.2、创建视图的语法解释
- 4.3、单个集合创建视图的示例
- 4.4、多个集合创建视图的示例
- 五、修改视图
- 5.1、修建视图的基本语法格式
- 5.2、修建视图的语法解释
- 5.3、修建视图的示例
- 六、删除视图
- MongoDB视图是一个可查询的对象,它的内容由其他集合或视图上的聚合管道定义。
- MongoDB不会将视图内容持久化到磁盘。 当客户端查询视图时,视图的内容按需计算。
- MongoDB可以要求客户端具有查询视图的权限。 MongoDB不支持对视图进行写操作。
- 数据抽象;
- 保护敏感数据的一种方法;
- 将敏感数据投影到视图之外;
- 只读;
- 结合基于角色的授权,可按角色访问信息。
-
准备数据集,执行脚本
var orders = new Array(); var shipping = new Array(); var addresses = ["广西省玉林市", "湖南省岳阳市", "湖北省荆州市", "甘肃省兰州市", "吉林省松原市", "江西省景德镇", "辽宁省沈阳市", "福建省厦门市", "广东省广州市", "北京市朝阳区"]; for (var i = 10000; i db.order.find()
-
查询order集合中的数据,查看是否初始化数据成功
> db.shipping.find()
-
创建视图的基本语法格式
db.createView( "", "", [], { "collation" : { } } )
-
创建视图的语法解释
函数解释viewName必须,视图名称source必须,数据源,集合/视图[]可选,一组管道collation可选,排序规则
-
查看当天最高的10笔订单视图,需要实时显示金额最高的订单
db.createView( "orderInfo", //视图名称 "order", //数据源 [ //筛选符合条件的订单,大于当天,这里要注意时区 { $match: { "orderTime": { $gte: ISODate("2022-01-26T00:00:00.000Z") } }}, //按金额倒序 { $sort: { "price": -1 } }, //限制10个文档 { $limit: 10 }, //选择要显示的字段 //0: 排除字段,若字段上使用(_id除外),就不能有其他包含字段 //1: 包含字段 { $project: { _id: 0, orderNo: 1, price: 1, orderTime: 1 } } ] )
-
查询orderInfo视图中的数据
> db.orderInfo.find()
-
跟单个集合是一样,只是多了$lookup连接操作符,视图根据管道最终结果显示,所以可以关联多个集合
-
根据订单编号关联查询订单编号、订单价格和物流地址
db.createView( "orderDetail", //视图名称 "order", //数据源 [ { $lookup: { from: "shipping", localField: "orderNo", foreignField: "orderNo", as: "shipping" } }, { $project: { "orderNo": 1, "price": 1, "shipping.address": 1 } } ] )
-
查询orderDetail视图中的数据
-
修建视图的基本语法格式
db.runCommand( collMod: "", viewOn: "", pipeline:[], { "collation" : { } } )
-
修建视图的语法解释
函数解释viewName必须,视图名称source必须,数据源,集合/视图[]可选,一组管道collation可选,排序规则
-
修改第4步中单个集合创建的orderInfo视图
db.runCommand({ collMod: "orderInfo", viewOn: "order", pipeline: [ { $match: { "orderTime": { $gte: ISODate("2020-04-13T16:00:00.000Z") } } }, { $sort: { "price": -1 } }, { $limit: 10 }, { $project: { _id: 0, orderNo: 1, price: 1, qty: 1, orderTime: 1 } } ] })
-
查询修改后的orderInfo视图数据
> db.orderInfo.find()
-
删除orderInfo视图
db.orderInfo.drop();
-
查询删除后的orderInfo视图数据
> db.orderInfo.find()