MongoDB——视图操作

Posted 小志的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB——视图操作相关的知识,希望对你有一定的参考价值。

目录

一、MongoDB视图的概述

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

二、MongoDB视图的作用

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

三、数据准备

  • 准备数据集,执行脚本

    var orders = new Array();
    var shipping = new Array();
    var addresses = ["广西省玉林市", "湖南省岳阳市", "湖北省荆州市", "甘肃省兰州市", "吉林省松原市", "江西省景德镇", "辽宁省沈阳市", "福建省厦门市", "广东省广州市", "北京市朝阳区"];
    for (var i = 10000; i < 20000; i++)  
    	var orderNo = i + Math.random().toString().substr(2, 5);
    	orders[i] =  orderNo: orderNo, userId: i, price: Math.round(Math.random() * 10000) / 100, qty: Math.floor(Math.random() * 10) + 1, orderTime: new Date(new Date().setSeconds(Math.floor(Math.random() * 10000))) ;
    	var address = addresses[Math.floor(Math.random() * 10)];
    	shipping[i] =  orderNo: orderNo, address: address, recipienter: "Wilson", province: address.substr(0, 3), city: address.substr(3, 3) 
    
    db.order.insert(orders); 
    db.shipping.insert(shipping);
    

  • 查询order集合中的数据,查看是否初始化数据成功

    > db.order.find()
    

  • 查询order集合中的数据,查看是否初始化数据成功

    > db.shipping.find()
    

四、创建视图

4.1、创建视图的基本语法格式

  • 创建视图的基本语法格式

    db.createView( 
    	"<viewName>", 
    	"<source>",
    	[<pipeline>], 
    	 
    		"collation" :  <collation>  
    	
    )
    

4.2、创建视图的语法解释

  • 创建视图的语法解释

    函数解释
    viewName必须,视图名称
    source必须,数据源,集合/视图
    []可选,一组管道
    collation可选,排序规则

4.3、单个集合创建视图的示例

  • 查看当天最高的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()
    

4.4、多个集合创建视图的示例

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

  • 根据订单编号关联查询订单编号、订单价格和物流地址

    	 db.createView( 
    	"orderDetail", //视图名称 
    	"order", //数据源
    	[ 
    		 $lookup:  from: "shipping", localField: "orderNo", foreignField: "orderNo", as: "shipping"  , 
    		 $project:  "orderNo": 1, "price": 1, "shipping.address": 1   
    	]
    )
    
  • 查询orderDetail视图中的数据

五、修改视图

5.1、修建视图的基本语法格式

  • 修建视图的基本语法格式

    db.runCommand( 
    	collMod: "<viewName>", 
    	viewOn: "<source>",
    	pipeline:[<pipeline>], 
    	 
    		"collation" :  <collation>  
    	
    )
    

5.2、修建视图的语法解释

  • 修建视图的语法解释

    函数解释
    viewName必须,视图名称
    source必须,数据源,集合/视图
    []可选,一组管道
    collation可选,排序规则

5.3、修建视图的示例

  • 修改第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()
    

以上是关于MongoDB——视图操作的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB面试指南之并发

刚刚,MongoDB宣布其即将支持ACID事务!

MongoDB 创建用户相关视图/管道

View(视图 MongoDB 文档翻译和解读)

将 MongoDB 视图合并到 Node 中

数据库 Mysql-mongodb-redis