【赵渝强老师】MongoDB的视图

简介: MongoDB视图是基于聚合管道的只读虚拟集合,不持久化数据,支持数据抽象、敏感字段过滤及RBAC权限控制。本文详解创建、多集合关联、修改与删除视图的完整操作,并附代码示例与视频讲解。(239字)

b450.png

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

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

其中:
viewName : 必须,视图名称
source : 必须,数据源,集合/视图
[<pipeline>] : 可选,一组管道
collation 可选,排序规则


视频讲解如下:


MongoDB视图的作用如下:

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


下面通过一个具体的示例来演示如何使用MongoDB的视图。

(1)准备订单数据。

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);
  db.order.insert({ 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)];
  db.shipping.insert({ orderNo: orderNo, address: address, recipienter: "Wilson",province: address.substr(0, 3), city: address.substr(3, 3)})
}

(2)单个集合创建视图。

# 查看当天最高的10笔订单视图
db.createView(
    "view1", //视图名称
    "order", //数据源
    [
        //筛选符合条件的订单,大于当天,这里要注意时区
        { $match: { "orderTime": { $gte: ISODate("2026-05-11T00:00:00.000Z") } }
        },
 
        //按金额倒序
        { $sort: { "price": -1 } },
        //限制10个文档
        { $limit: 10 },
        //选择要显示的字段
        //0: 排除字段,若字段上使用(_id除外),就不能有其他包含字段
        //1: 包含字段
        { $project: { _id: 0, orderNo: 1, price: 1, orderTime: 1 } }
    ]
)

(3)从视图view1中获取数据。

> db.view1.find()
# 输出的信息如下:
[
  {
    orderNo: '1442565357',
    price: 99.99,
    orderTime: ISODate('2026-06-04T10:27:18.746Z')
  },
  {
    orderNo: '1031973252',
    price: 99.97,
    orderTime: ISODate('2026-06-04T11:43:05.681Z')
  },
  {
    orderNo: '1463969572',
    price: 99.97,
    orderTime: ISODate('2026-06-04T10:27:38.128Z')
  },
  {
    orderNo: '1899077847',
    price: 99.96,
    orderTime: ISODate('2026-06-04T10:32:18.359Z')
  },
  {
    orderNo: '1653595479',
    price: 99.95,
    orderTime: ISODate('2026-06-04T09:39:51.011Z')
  },
  {
    orderNo: '1906796333',
    price: 99.92,
    orderTime: ISODate('2026-06-04T09:56:20.742Z')
  },
  {
    orderNo: '1626993450',
    price: 99.9,
    orderTime: ISODate('2026-06-04T10:20:59.321Z')
  },
  {
    orderNo: '1155873783',
    price: 99.88,
    orderTime: ISODate('2026-06-04T11:06:01.219Z')
  },
  {
    orderNo: '1398108625',
    price: 99.87,
    orderTime: ISODate('2026-06-04T10:41:03.724Z')
  },
  {
    orderNo: '1635044250',
    price: 99.86,
    orderTime: ISODate('2026-06-04T10:52:20.818Z')
  }
]

(4)多个集合创建视图。

# 跟单个是集合是一样,只是多了$lookup连接操作符,视图根据管道最终结果显示,
# 所以可以关联多个集合。例如:根据订单号查询订单信息包含订单地址。
db.createView(
  "view2",
  "order",
  [
    { $lookup: { from: "shipping", localField: "orderNo", foreignField:"orderNo", as: "shipping" } },
    { $project: { "orderNo": 1, "price": 1, "shipping.address": 1 } }
  ]
)

(5)从视图view2中获取数据。

> db.view2.find()
# 输出的信息如下:
[
  {
    _id: ObjectId('6a214302a4248a3ab4544ca7'),
    orderNo: '1000065455',
    price: 63.33,
    shipping: [ { address: '甘肃省兰州市' } ]
  },
  {
    _id: ObjectId('6a214302a4248a3ab4544ca9'),
    orderNo: '1000142943',
    price: 96.43,
    shipping: [ { address: '广东省广州市' } ]
  },
  {
    _id: ObjectId('6a214302a4248a3ab4544cab'),
    orderNo: '1000285463',
    price: 50.78,
    shipping: [ { address: '福建省厦门市' } ]
  },
  {
    _id: ObjectId('6a214302a4248a3ab4544cad'),
    orderNo: '1000394584',
    price: 93.64,
    shipping: [ { address: '江西省景德镇' } ]
  },
  {
    _id: ObjectId('6a214302a4248a3ab4544caf'),
    orderNo: '1000449405',
    price: 90.27,
    shipping: [ { address: '吉林省松原市' } ]
  },
  {
    _id: ObjectId('6a214302a4248a3ab4544cb1'),
    orderNo: '1000510062',
    price: 24.5,
    shipping: [ { address: '湖北省荆州市' } ]
  },
  {
    _id: ObjectId('6a214302a4248a3ab4544cb3'),
    orderNo: '1000647580',
    price: 66.48,
    shipping: [ { address: '湖北省荆州市' } ]
  },
  {
    _id: ObjectId('6a214302a4248a3ab4544cb5'),
    orderNo: '1000741685',
    price: 48.55,
    shipping: [ { address: '湖北省荆州市' } ]
  },
  {
    _id: ObjectId('6a214302a4248a3ab4544cb7'),
    orderNo: '1000867503',
    price: 39.19,
    shipping: [ { address: '吉林省松原市' } ]
  },
  {
    _id: ObjectId('6a214302a4248a3ab4544cb9'),
    orderNo: '1000980361',
    price: 78.25,
    shipping: [ { address: '甘肃省兰州市' } ]
  },
  {
    _id: ObjectId('6a214302a4248a3ab4544cbb'),
    orderNo: '1001021219',
    price: 70.77,
    shipping: [ { address: '北京市朝阳区' } ]
  },
  {
    _id: ObjectId('6a214302a4248a3ab4544cbd'),
    orderNo: '1001191893',
    price: 81.59,
    shipping: [ { address: '北京市朝阳区' } ]
  },
  {
    _id: ObjectId('6a214302a4248a3ab4544cbf'),
    orderNo: '1001277484',
    price: 83.1,
    shipping: [ { address: '湖北省荆州市' } ]
  },
  {
    _id: ObjectId('6a214302a4248a3ab4544cc1'),
    orderNo: '1001328249',
    price: 72.23,
    shipping: [ { address: '北京市朝阳区' } ]
  },
  {
    _id: ObjectId('6a214302a4248a3ab4544cc3'),
    orderNo: '1001438512',
    price: 28.21,
    shipping: [ { address: '吉林省松原市' } ]
  },
  {
    _id: ObjectId('6a214302a4248a3ab4544cc5'),
    orderNo: '1001529582',
    price: 51.02,
    shipping: [ { address: '甘肃省兰州市' } ]
  },
  {
    _id: ObjectId('6a214302a4248a3ab4544cc7'),
    orderNo: '1001665500',
    price: 17.44,
    shipping: [ { address: '北京市朝阳区' } ]
  },
  {
    _id: ObjectId('6a214302a4248a3ab4544cc9'),
    orderNo: '1001713524',
    price: 76.64,
    shipping: [ { address: '辽宁省沈阳市' } ]
  },
  {
    _id: ObjectId('6a214302a4248a3ab4544ccb'),
    orderNo: '1001876888',
    price: 92.35,
    shipping: [ { address: '北京市朝阳区' } ]
  },
  {
    _id: ObjectId('6a214302a4248a3ab4544ccd'),
    orderNo: '1001993621',
    price: 9.71,
    shipping: [ { address: '吉林省松原市' } ]
  }
]
Type "it" for more

(6)修改视图。

# 例如:在view1上增加数量字段qty
db.runCommand({
  collMod: "view1",
  viewOn: "order",
  pipeline: [
    { $match: { "orderTime": { $gte: ISODate("2026-05-11T00:00:00.000Z") } }
    },
    { $sort: { "price": -1 } },
    { $limit: 10 },
    //增加qty
    { $project: { _id: 0, orderNo: 1, price: 1, qty: 1, orderTime: 1 } }
  ]
})

(7)删除视图

db.view1.drop()
db.view2.drop()
相关文章
|
NoSQL 索引
MongoDB查询优化:从 10s 到 10ms
本文是我前同事付秋雷最近遇到到一个关于MongoDB执行计划选择的问题,非常有意思,在探索源码之后,他将整个问题搞明白并整理分享出来。付秋雷(他的博客)曾是Tair(阿里内部用得非常官方的KV存储系统)的核心开发,目前就职于蘑菇街。
|
6月前
|
存储 缓存 算法
SGLang Hierarchical Sparse Attention 技术深度解析
阿里云 Tair 联合 SGLang 推出分层稀疏化框架,通过“稀疏+分层”协同优化,将 KVCache 从 GPU 显存扩展至 CPU 与远端存储,实现计算与存储效率双突破,为百万级超长上下文推理提供新路径。
|
存储 缓存 NoSQL
开源 | 阿里云 Tair KVCache Manager:企业级全局 KVCache 管理服务的架构设计与实现
阿里云 Tair 联合团队推出企业级全局 KVCache 管理服务 Tair KVCache Manager,通过中心化元数据管理与多后端存储池化,实现 KVCache 的跨实例共享与智能调度。该服务解耦算力与存储,支持弹性伸缩、多租户隔离及高可用保障,显著提升缓存命中率与资源利用率,重构大模型推理成本模型,支撑智能体时代的规模化推理需求。
|
存储 机器学习/深度学习 缓存
Hybrid Model Support:阿里云 Tair 联合 SGLang对 Mamba-Transformer 等混合架构模型的支持方案
阿里云 Tair KVCache 联合 SGLang,创新支持 Mamba-Transformer 等混合架构模型。通过双池内存、状态快照等技术,解决异构状态管理难题,实现前缀缓存与推测解码,显著提升 Qwen3-Next 等模型的推理效率,推动大模型迈向高效智能体时代。
|
9月前
|
人工智能 Java 开发者
开源|Python 应用往微服务迈进的 1*3 种 Pythonic 步伐
本文介绍基于Nacos的Python微服务解决方案nacos-serving-python,实现无侵入式服务注册与发现,让Python应用以Pythonic方式轻松接入微服务架构,支持多种HTTP客户端与低侵入集成,助力AI与微服务融合。
813 29
开源|Python 应用往微服务迈进的 1*3 种 Pythonic 步伐
|
7月前
|
运维 监控 Python
Python 微服务架构实践:从模块化到轻量级分布式
本文详解Python微服务落地路径:从模块化拆分、轻量框架封装,到服务通信、注册发现,再到Docker容器化部署与监控运维,系统阐述中小团队如何以低成本实现“低耦合、快迭代”的分布式架构。
|
人工智能 云计算
南京大学与阿里云签署校企合作协议,以“云工开物”支持人工智能人才培养与科研创新
3月28日,南京大学与阿里云签署全面校企合作协议,共同推动科教融汇与产教融合。双方将启动人工智能人才培养计划,基于阿里云技术优势和南大学科实力,设计通识课程与实践课程,支持“1+X+Y”课程体系建设。阿里云将为南大师生提供免费算力资源,助力教学科研,并通过产学研合作培养新工科拔尖创新人才,推动科技成果转化与高水平自立自强。
|
10月前
|
分布式计算 Java 关系型数据库
二、Sqoop 详细安装部署教程
在大数据开发实战中,Sqoop 是数据库与 Hadoop 生态之间不可或缺的数据传输工具。这篇文章将以 Sqoop 1.4.7 为例,结合官方站点截图,详细讲解 Sqoop 的下载路径、安装步骤、环境配置,以及常见 JDBC 驱动的准备过程,帮你一步步搭建出能正常运行的 Sqoop 环境,并通过 list-databases 命令验证安装是否成功。如果你正打算学习 Sqoop,或者在搭建大数据平台过程中遇到安装配置问题,本文将是非常实用的参考指南。
1026 6
|
缓存 并行计算 PyTorch
PyTorch CUDA内存管理优化:深度理解GPU资源分配与缓存机制
本文深入探讨了PyTorch中GPU内存管理的核心机制,特别是CUDA缓存分配器的作用与优化策略。文章分析了常见的“CUDA out of memory”问题及其成因,并通过实际案例(如Llama 1B模型训练)展示了内存分配模式。PyTorch的缓存分配器通过内存池化、延迟释放和碎片化优化等技术,显著提升了内存使用效率,减少了系统调用开销。此外,文章还介绍了高级优化方法,包括混合精度训练、梯度检查点技术及自定义内存分配器配置。这些策略有助于开发者在有限硬件资源下实现更高性能的深度学习模型训练与推理。
2475 0
|
机器学习/深度学习 存储 缓存
LLM高效推理:KV缓存与分页注意力机制深度解析
随着大型语言模型(LLM)规模和复杂性的增长,高效推理变得至关重要。KV缓存和分页注意力是优化LLM推理的两项关键技术。KV缓存通过存储键值对减少重复计算,而分页注意力则通过将序列分割成小块来降低内存消耗,从而有效处理长序列。本文深入剖析这些技术的工作原理及其在仅解码器模型中的应用,探讨其优势与挑战,并展示其实现示例。
1250 16
LLM高效推理:KV缓存与分页注意力机制深度解析