db.createView()

在本页面

将指定的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

视图是只读的;对视图的写操作将出错。

以下读取操作可以支持视图:

索引使用和排序操作

例如,以下操作是* invalid *:

db.view.find().sort({$natural: 1})

Projection Restrictions

视图上的find()操作不支持以下projection运算符:

Immutable Name

您不能重命名views

View Creation

Sharded View

如果视图的基础集合被分片,则认为它们是分片的。因此,您无法在$lookup$graphLookup操作中为from字段指定分片视图。

视图和排序规则

Access Control

如果部署实施authentication/authorization,则db.createView()需要以下特权:

or

or

在数据库上具有createCollection且在视图上具有find的用户没有足够的特权。

readWrite内置角色包含必需的特权。或者,您可以创建一个自定义角色支持db.createView()

下面的示例使用db.createUser()方法在admin数据库中创建一个用户,该用户在inventoryemployees数据库中具有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" }

以下操作使用_idfeedback.managementdepartment字段创建一个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视图上执行聚合,使用$sortByCountdepartment字段进行分组,并按每个不同部门的数量按降序排序:

db.managementFeedback.aggregate([ { $sortByCount: "$department" } ] )

该操作返回以下文档:

{ "_id" : "A", "count" : 2 }
{ "_id" : "B", "count" : 1 }

从多个集合创建视图

给定以下两个集合:

{ "_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 }
{ "_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视图上执行聚合,使用$sortByCountitem字段进行分组,并按每个独立项目的计数按降序排序:

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

整理和意见

首页