在MongoDB中,视图是一种非常实用的功能。简单来说,MongoDB视图就像“虚拟集合”,本身不存储任何数据,而是基于其他集合或视图,通过聚合管道实时计算而来。这相当于为你提供了一套特制的“数据滤镜”,你只能看到它允许你访问的内容。需要特别注意的是:视图是只读的,不能直接写入数据;查询视图时,MongoDB会按需计算,结果不会持久化到磁盘;此外,访问权限也可以独立配置,实现精细化的数据安全控制。
创建视图的语法非常简洁明了:
视频教程详细演示如下:
那么视图究竟能发挥什么作用呢?其核心价值在于数据抽象与安全保护。例如,你可以将敏感字段(如用户密码)排除在视图之外,从而实现数据脱敏。同时,结合基于角色的授权机制,能够为不同角色提供差异化的数据访问,灵活性很高。总结来说:提取公共业务逻辑,安全地暴露指定字段,且天然具备只读特性。
接下来,我们通过具体代码,从零开始演示完整的操作流程。
(1)准备订单样本数据
首先,向数据库中插入一批模拟的订单数据和配送地址数据。通过循环生成10000条记录,订单号、价格、数量、时间均为随机生成,地址则从预定义的数组中随机选取。
(2)在单个集合上创建视图
现在有一个需求:我们希望查看当天金额最高的10笔订单,但无需显示用户ID、数量等字段,仅需订单号、价格和下单时间。通过创建视图即可轻松实现。注意,我们使用$match筛选当天数据,用$sort和$limit获取前10条,最后用$project只暴露需要的字段。
(3)查询视图
视图创建完成后,查询它与查询普通集合一样简单。执行 db.view1.find(),结果仅返回我们指定的三个字段,敏感数据被完美隐藏,这正是MongoDB视图的数据保护优势。
(4)多集合关联创建视图
视图的强大之处在于它基于聚合管道,因此$lookup(左连接)等操作在视图内部同样适用。例如,我们可以根据订单号将订单信息和配送地址关联起来,创建一个“订单-地址”联合视图,极大地方便了数据整合。
(5)查询关联视图
现在查询view2,可以看到每个订单都携带着配送地址,数据整合得非常干净,无需手动关联多个集合。
(6)修改视图
当业务需求变化,原有视图不再满足新要求时,无需删除重建。使用collMod命令即可修改视图的管道定义。例如,若想在view1中额外展示“数量(qty)”字段,只需在管道对应的$project阶段增加字段映射即可。
(7)删除视图
如果视图不再需要,直接使用drop()方法删除即可。需要注意的是,删除视图不会影响原始数据,因为视图本身仅是逻辑映射。
