
MongoDB视图是一个可查询的对象,它的内容由其他集合或视图上的聚合管道定义。MongoDB不会将视图的内容持久化到磁盘。当客户端通过视图查询数据时,视图的内容按需计算。MongoDB可以要求客户端具有查询视图的权限。MongoDB不支持对视图进行写操作。创建MongoDB视图的语法如下:
javascript
db.createView(
"<viewName>",
"<source>",
[<pipeline>],
{
"collation" : { <collation> }
}
)
其中:
viewName : 必须,视图名称
source : 必须,数据源,集合/视图
[<pipeline>] : 可选,一组管道
collation 可选,排序规则
| 视频讲解如下 |
|---|
| 【赵渝强老师】MongoDB的视图 |
MongoDB视图的作用如下:
- 数据抽象
- 保护敏感数据的一种方法
- 将敏感数据投影到视图之外
- 只读
- 结合基于角色的授权,可按角色访问信息
下面通过一个具体的示例来演示如何使用MongoDB的视图。
(1)准备订单数据。
javascript
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)单个集合创建视图。
javascript
# 查看当天最高的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中获取数据。
javascript
> 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)多个集合创建视图。
javascript
# 跟单个是集合是一样,只是多了$lookup连接操作符,视图根据管道最终结果显示,
# 所以可以关联多个集合。例如:根据订单号查询订单信息包含订单地址。
db.createView(
"view2",
"order",
[
{ $lookup: { from: "shipping", localField: "orderNo", foreignField:"orderNo", as: "shipping" } },
{ $project: { "orderNo": 1, "price": 1, "shipping.address": 1 } }
]
)
(5)从视图view2中获取数据。
javascript
> 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)修改视图。
javascript
# 例如:在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)删除视图
javascript
db.view1.drop()
db.view2.drop()