On this page
db.createView()
在本页面
db.
createView
( )- 3.4 版的新功能。
将指定的aggregation pipeline应用于源集合或视图的结果,创建一个view。视图充当只读集合,并在读取操作期间按需计算。您必须在与源集合相同的数据库中创建视图。 MongoDB 在基础聚合管道中对视图执行读取操作。
db.createView具有以下语法:
db.createView(<view>, <source>, <pipeline>, <options>)
该方法接受以下参数:
Parameter | Type | Description |
---|---|---|
view |
string | 要创建的视图的名称。 |
source |
string | 从中创建视图的源集合或视图的名称。名称不是集合或视图的完整名称空间;即不包含数据库名称,而是暗示与要创建的视图相同的数据库。您必须在与源集合相同的数据库中创建视图。 |
pipeline |
array | 由聚合管道阶段组成的数组。 db.createView通过将指定的pipeline 应用于source 集合或视图来创建视图。 |
视图定义是公共的;即视图上的db.getCollectionInfos()和explain
操作将包括定义视图的管道。因此,请避免在视图定义中直接引用敏感字段和值。
| options
|文档|可选。该方法的其他选项。
选项文档包含以下选项字段:
Field | Type | Description |
---|---|---|
collation |
document | 可选的。指定视图的默认collation。 |
Collation允许用户为字符串比较指定特定于语言的规则,例如字母大写和重音符号的规则。
如果基础source
是一个集合,则该视图不会继承该集合的排序规则设置。
如果未指定排序规则,则视图的默认排序规则为“简单”二进制比较排序规则。
如果基础source
是另一个视图,则该视图必须指定相同的排序规则设置。
排序规则选项具有以下语法:
collation: {
locale: <string>,
caseLevel: <boolean>,
caseFirst: <string>,
strength: <int>,
numericOrdering: <boolean>,
alternate: <string>,
maxVariable: <string>,
backwards: <boolean>
}
指定排序规则时,locale
字段为必填字段;所有其他排序规则字段都是可选的。有关字段的说明,请参见Collation Document。
3.4 版中的新功能。
db.createView()方法包装以下create命令操作:
db.runCommand( { create: <view>, viewOn: <source>, pipeline: <pipeline>, collation: <collation> } )
列出集合的操作(例如db.getCollectionInfos()和db.getCollectionNames())在其输出中包括视图。
Important
视图定义是公共的;即视图上的db.getCollectionInfos()和explain
操作将包括定义视图的管道。因此,请避免在视图定义中直接引用敏感字段和值。
要删除视图,请在视图上使用drop()方法。
Behavior
视图表现出以下行为:
Read Only
视图是只读的;对视图的写操作将出错。
以下读取操作可以支持视图:
索引使用和排序操作
视图使用基础集合的索引。
由于索引位于基础集合上,因此您无法直接在视图上创建,删除或重建索引,也无法在视图上获取索引列表。
您不能在视图上指定$natural排序。
例如,以下操作是* invalid *:
db.view.find().sort({$natural: 1})
Projection Restrictions
视图上的find()操作不支持以下projection运算符:
Immutable Name
您不能重命名views。
View Creation
视图是在读取操作期间按需计算的,并且 MongoDB 对视图执行读取操作,这是基础聚合管道的一部分。因此,视图不支持以下操作:
如果用于创建视图的聚合管道禁止显示
_id
字段,则视图中的文档将没有_id
字段。
Sharded View
视图和排序规则
您可以在创建时为视图指定默认的collation。如果未指定排序规则,则视图的默认排序规则为“简单”二进制比较排序规则。也就是说,视图不会继承集合的默认排序规则。
视图上的字符串比较使用视图的默认排序规则。尝试更改或覆盖视图的默认排序规则的操作将失败,并显示错误。
如果从另一个视图创建视图,则不能指定与源视图的排序规则不同的排序规则。
如果执行涉及多个视图的聚合(例如$lookup或$graphLookup),则这些视图必须具有相同的collation。
Access Control
如果部署实施authentication/authorization,则db.createView()需要以下特权:
- createCollection在数据库上
or
- createCollection在数据库上和 find在源集合/视图上
or
- createCollection在数据库上,find在要创建的视图上,和 find在源集合/视图上
在数据库上具有createCollection且在视图上具有find的用户没有足够的特权。
readWrite内置角色包含必需的特权。或者,您可以创建一个自定义角色支持db.createView()。
下面的示例使用db.createUser()方法在admin
数据库中创建一个用户,该用户在inventory
和employees
数据库中具有readWrite
角色:
db.getSiblingDB("admin").createUser(
{
"user" : "createViewUser",
"pwd" : "replaceThisWithASecurePassword",
"roles" : [
{ "db" : "inventory", "role" : "readWrite" },
{ "db" : "employees", "role" : "readWrite" }
]
}
)
创建的用户可以在指定的数据库上执行db.createView()。有关创建用户的更多示例,请参见Add Users。
或者,您可以使用db.grantRolesToUser()将所需角色添加到现有用户。有关向现有数据库用户添加特权的教程,请参见修改现有用户的访问权限。
Examples
从单个集合创建视图
给定了具有以下文档的survey
集合:
{ _id: 1, empNumber: "abc123", feedback: { management: 3, environment: 3 }, department: "A" }
{ _id: 2, empNumber: "xyz987", feedback: { management: 2, environment: 3 }, department: "B" }
{ _id: 3, empNumber: "ijk555", feedback: { management: 3, environment: 4 }, department: "A" }
以下操作使用_id
,feedback.management
和department
字段创建一个managementFeedback
视图:
db.createView(
"managementFeedback",
"survey",
[ { $project: { "management": "$feedback.management", department: 1 } } ]
)
查询视图
要查询视图,可以在视图上使用db.collection.find():
db.managementFeedback.find()
该操作返回以下文档:
{ "_id" : 1, "department" : "A", "management" : 3 }
{ "_id" : 2, "department" : "B", "management" : 2 }
{ "_id" : 3, "department" : "A", "management" : 3 }
在视图上执行聚合管道
以下操作在managementFeedback
视图上执行聚合,使用$sortByCount
对department
字段进行分组,并按每个不同部门的数量按降序排序:
db.managementFeedback.aggregate([ { $sortByCount: "$department" } ] )
该操作返回以下文档:
{ "_id" : "A", "count" : 2 }
{ "_id" : "B", "count" : 1 }
从多个集合创建视图
给定以下两个集合:
orders
集合:
{ "_id" : 1, "item" : "abc", "price" : NumberDecimal("12.00"), "quantity" : 2 }
{ "_id" : 2, "item" : "jkl", "price" : NumberDecimal("20.00"), "quantity" : 1 }
{ "_id" : 3, "item" : "abc", "price" : NumberDecimal("10.95"), "quantity" : 5 }
{ "_id" : 4, "item" : "xyz", "price" : NumberDecimal("5.95"), "quantity" : 5 }
{ "_id" : 5, "item" : "xyz", "price" : NumberDecimal("5.95"), "quantity" : 10 }
inventory
集合:
{ "_id" : 1, "sku" : "abc", description: "product 1", "instock" : 120 }
{ "_id" : 2, "sku" : "def", description: "product 2", "instock" : 80 }
{ "_id" : 3, "sku" : "ijk", description: "product 3", "instock" : 60 }
{ "_id" : 4, "sku" : "jkl", description: "product 4", "instock" : 70 }
{ "_id" : 5, "sku" : "xyz", description: "product 5", "instock" : 200 }
下面的db.createView()示例指定了一个$lookup阶段,以从两个集合的联接中创建视图:
db.createView (
"orderDetails",
"orders",
[
{ $lookup: { from: "inventory", localField: "item", foreignField: "sku", as: "inventory_docs" } },
{ $project: { "inventory_docs._id": 0, "inventory_docs.sku": 0 } }
]
)
查询视图
要查询视图,可以在视图上使用db.collection.find():
db.orderDetails.find()
该操作返回以下文档:
{
"_id" : 1,
"item" : "abc",
"price" : NumberDecimal("12.00"),
"quantity" : 2,
"inventory_docs" : [ { "description" : "product 1", "instock" : 120 } ]
}
{
"_id" : 2,
"item" : "jkl",
"price" : NumberDecimal("20.00"),
"quantity" : 1,
"inventory_docs" : [ { "description" : "product 4", "instock" : 70 } ]
}
{
"_id" : 3,
"item" : "abc",
"price" : NumberDecimal("10.95"),
"quantity" : 5,
"inventory_docs" : [ { "description" : "product 1", "instock" : 120 } ]
}
{
"_id" : 4,
"item" : "xyz",
"price" : NumberDecimal("5.95"),
"quantity" : 5,
"inventory_docs" : [ { "description" : "product 5", "instock" : 200 } ]
}
{
"_id" : 5,
"item" : "xyz",
"price" : NumberDecimal("5.95"),
"quantity" : 10,
"inventory_docs" : [ { "description" : "product 5", "instock" : 200 } ]
}
在视图上执行聚合管道
以下操作在orderDetails
视图上执行聚合,使用$sortByCount
对item
字段进行分组,并按每个独立项目的计数按降序排序:
db.orderDetails.aggregate( [ { $sortByCount: "$item" } ] )
该操作返回以下文档:
{ "_id" : "xyz", "count" : 2 }
{ "_id" : "abc", "count" : 2 }
{ "_id" : "jkl", "count" : 1 }
使用默认排序规则创建视图
给定places
集合以及以下文档:
{ _id: 1, category: "café" }
{ _id: 2, category: "cafe" }
{ _id: 3, category: "cafE" }
以下操作创建一个视图,在视图级别指定collation:
db.createView(
"placesView",
"places",
[ { $project: { category: 1 } } ],
{ collation: { locale: "fr", strength: 1 } }
)
视图上的字符串比较使用视图的默认排序规则。例如,以下操作使用视图的排序规则:
db.placesView.count( { category: "cafe" } )
该操作返回3
。
尝试更改或覆盖视图的默认排序规则的操作将失败,并显示错误。
See also