6.视图

介绍

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

作用:

  • 数据抽象
  • 保护敏感数据的一种方法
  • 将敏感数据投影到视图之外
  • 只读
  • 结合基于角色的授权,可按角色访问信息

创建视图

db.createView(
    "<viewName>", #viewName : 必须,视图名称
    "<source>", #source : 必须,数据源,集合/视图
    [<pipeline>], #[] : 可选,一组管道
    {
    	"collation" : { <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 } }
    ]
)

多个集合创建视图

跟单个是集合是一样,只是多了$lookup连接操作符,视图根据管道最终结果显示,所以可以关联多个 集合

db.orderDetail.drop()
db.createView(
    "orderDetail",
    "order",
    [
        { $lookup: 
        	{ 
        	from: "shipping", 
        	localField: "orderNo", 
        	foreignField:"orderNo", 
        	as: "shipping" 
        	} 
        },
        { $project: { "orderNo": 1, "price": 1, "shipping.address": 1 } }
    ]
)

修改视图

db.runCommand({
    collMod: "orderInfo",
    viewOn: "order",
    pipeline: [
    { $match: { "orderTime": { $gte: ISODate("2020-04-13T16:00:00.000Z") } }},
    { $sort: { "price": -1 } },
    { $limit: 10 },
    //增加qty
    { $project: { _id: 0, orderNo: 1, price: 1, qty: 1, orderTime: 1 } }
    ]
})
	

删除视图

db.orderInfo.drop();

参考<图灵课堂>

posted @ 2022-03-24 10:58  RollBack2010  阅读(69)  评论(0编辑  收藏  举报