MongoDB创建和查询视图(一)

目录

限制和注意事项

应用两种方式创建视图


本文整理mongodb的官方文档,介绍mongodb的视图创建和查询。

Mongodb中,允许使用两种方式来创建视图。

复制代码
//使用db.createCollection()来创建视图
db.createCollection(
  "<viewName>",
  {
    "viewOn": "<source>",
    "pipeline": [<pipeline>],
    "collation": {<collation>}
  }
)
//使用db.createView()来创建视图
db.createView(
  "<viewName>",
  "<source>",
  [<pipeline>],
  {
    "collation": { <collation>}
  }
)

限制和注意事项

  • 创建视图时,要创建的视图需要与依赖的集合在同一个数据库。
  • 在普通视图的定义的管道中中,不能出现out和merge过程。在lookup或facet过程中也不能出现merge和out。
  • 视图创建后,不可以被重新命名,不可以修改视图名称。
  • 视图中,不能够使用mapReduce(), text, geoNear等命令。
  • Mongodb查看集合的操作,如db.getCollectionInfos()和db.getCollectionNames()命令,结果集中会包含用户定义的视图信息。
  • 视图的定义对用户是可见的,使用命令db.getCollectionInfos()或通过explain查询执行计划时,打印出来的信息会包含视图的定义信息。因此,用户需要在定义视图中避免直接引用敏感字段和字段值。
  • 使用AtlasUI,用户只能创建物化视图。
  • 使用find()命令查询视图中,不支持操作符, elemMatch, slice, meta
  • 使用db.collection.find()方法查询视图时,filter, projection, sort, skip, limit等查询方法,转化成等价的集合管道查询方法。
  • Mongodb将客户端视图查询条件与视图定义中的管道操作一起进行查询优化
  • 查询优化器不会改变视图的查询结果,只是重新编排管道中查询操作的顺序来提高效率。
  • 使用db.createView()命令创建视图的过程中,会在依赖的集合上加锁。所有对该集合的操作需要等视图创建结束后才能执行。
  • 创建视图的过程中,Mongodb会在system.view集合上加锁,当创建视图结束后,该锁才会被释放。

应用两种方式创建视图

构建一个student集合,用于创建视图

复制代码
db.students.insertMany( [
    { sID: 22001, name: "Alex", year: 1, score: 4.0},
    { sID: 21001, name: "bernie", year: 2, score: 3.7},
    { sID: 20010, name: "Chris", year: 3, score: 2.5},
    { sID: 22021, name: "Drew", year: 1, score: 3.2},
    { sID: 17301, name: "harley", year: 6, score: 3.1},
    { sID: 21022, name: "Farmer", year: 1, score: 2.2},
    { sID: 20020, name: "george", year: 3, score: 2.8},
    { sID: 18020, name: "Harley", year: 5, score: 2.8}
])

使用db.createView()创建一个视图,查询出一年级学生的数据

复制代码
db.createView(
    "V_firstYears", //视图名称
    "students",  //基于集合students创建视图
    [{ $match: {year: 1}}] //集合查询,匹配students表中一年级学生的数据
    )

查询集合V_firstYears的数据

复制代码
db.V_firstYears.find({},{_id: 0}) //使用{_id: 0}关闭返回结果中文档id
/* 1 createdAt:12/25/2023, 4:01:19 PM*/
{
	"_id" : ObjectId("658936cfe0ac6d3d14d04bde"),
	"sID" : 22001,
	"name" : "Alex",
	"year" : 1,
	"score" : 4
},

/* 2 createdAt:12/25/2023, 4:01:19 PM*/
{
	"_id" : ObjectId("658936cfe0ac6d3d14d04be1"),
	"sID" : 22021,
	"name" : "Drew",
	"year" : 1,
	"score" : 3.2
},

/* 3 createdAt:12/25/2023, 4:01:19 PM*/
{
	"_id" : ObjectId("658936cfe0ac6d3d14d04be3"),
	"sID" : 21022,
	"name" : "Farmer",
	"year" : 1,
	"score" : 2.2
}

使用db.createCollection()方法创建一个查询毕业生的视图。

复制代码
db.createCollection(
    "v_graduateStudents", 
    {
        viewOn: "students",
        pipeline: [ { $match: { $expr: { $gt: ["$year", 4]}}}],//查询超过4年的数据
        collation: { locale: "en", caseFirst: "upper"} //添加字符序定义,指定排序方法
    }
)

查询定义的毕业生视图。查询过程中,添加了按照学生姓名进行排序。定义视图时指定了按照大写字母优先的排序规则,则Harey排在前面。

复制代码
db.v_graduateStudents.find({},{_id: 0}).sort('name')

/* 1 */
{
	"sID" : 18020,
	"name" : "Harley",
	"year" : 5,
	"score" : 2.8
},

/* 2 */
{
	"sID" : 17301,
	"name" : "harley",
	"year" : 6,
	"score" : 3.1
}

删除视图,重新建立一个小写字母优先的字符序规则

复制代码
db.v_graduateStudents.drop()

db.createCollection(
    "v_graduateStudents", 
    {
        viewOn: "students",
        pipeline: [ { $match: { $expr: { $gt: ["$year", 4]}}}],
        collation: { locale: "en", caseFirst: "lower"}
    }
)

查询新建的视图,返回结果与前面的排序结果不同。

复制代码
db.v_graduateStudents.find({},{_id: 0}).sort('name')

/* 1 */
{
	"sID" : 17301,
	"name" : "harley",
	"year" : 6,
	"score" : 3.1
},

/* 2 */
{
	"sID" : 18020,
	"name" : "Harley",
	"year" : 5,
	"score" : 2.8
}
相关推荐
JosieBook18 分钟前
【数据库】时序数据库选型指南:在大数据与工业4.0时代,为何 Apache IoTDB 成为智慧之选?
大数据·数据库·时序数据库
程序员三明治19 分钟前
详解Redis锁误删、原子性难题及Redisson加锁底层原理、WatchDog续约机制
java·数据库·redis·分布式锁·redisson·watchdog·看门狗
chenzhou__27 分钟前
MYSQL学习笔记(个人)(第十五天)
linux·数据库·笔记·学习·mysql
一只自律的鸡1 小时前
【MySQL】第二章 基本的SELECT语句
数据库·mysql
liliangcsdn2 小时前
如何使用python创建和维护sqlite3数据库
数据库·sqlite
TDengine (老段)9 小时前
TDengine 数学函数 DEGRESS 用户手册
大数据·数据库·sql·物联网·时序数据库·iot·tdengine
TDengine (老段)9 小时前
TDengine 数学函数 GREATEST 用户手册
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
安当加密9 小时前
云原生时代的数据库字段加密:在微服务与 Kubernetes 中实现合规与敏捷的统一
数据库·微服务·云原生
爱喝白开水a9 小时前
LangChain 基础系列之 Prompt 工程详解:从设计原理到实战模板_langchain prompt
开发语言·数据库·人工智能·python·langchain·prompt·知识图谱
想ai抽9 小时前
深入starrocks-多列联合统计一致性探查与策略(YY一下)
java·数据库·数据仓库