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()