MongoDB创建和查询视图的方式

 更新时间:2023年12月26日 11:53:00   作者:威赞  
本文整理mongodb的官方文档,介绍mongodb的视图创建和查询,在Mongodb中,允许使用两种方式来创建视图,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

本文整理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
}

到此这篇关于MongoDB创建和查询视图的文章就介绍到这了,更多相关MongoDB查询视图内容请搜索程序员之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持程序员之家!

您可能感兴趣的文章:

相关文章

  • MySQL和MongoDB设计实例对比分析

    MySQL和MongoDB设计实例对比分析

    MySQL是关系型数据库中的明星,MongoDB是文档型数据库中的翘楚。
    2011-07-07
  • mongodb添加arbiter节点的方法示例

    mongodb添加arbiter节点的方法示例

    这篇文章主要给大家分享了关于利用mongodb添加arbiter节点的方法示例,文中给出了详细的示例代码,相信对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
    2017-02-02
  • windows安装mongodb6.x并设置用户名密码的详细过程

    windows安装mongodb6.x并设置用户名密码的详细过程

    这篇文章主要介绍了windows安装mongodb6.x并设置用户名密码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • MongoDB快速翻页的方法

    MongoDB快速翻页的方法

    这篇文章主要为大家详细介绍了MongoDB快速翻页的方法,通过实例学习在MongoDB中翻阅数据的不同方式,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • MongoDB数据去重与保存最新数据操作指南

    MongoDB数据去重与保存最新数据操作指南

    在 MongoDB 数据库中,我们经常需要进行数据去重并保留最新的数据,本文将介绍如何使用 MongoDB 聚合操作完成这一任务,并将结果保存到新的集合或者覆盖原有的集合,感兴趣的小伙伴跟着小编一起来看看吧
    2024-01-01
  • MongoDB中的常用语句总结大全

    MongoDB中的常用语句总结大全

    这篇文章主要给大家总结介绍了关于MongoDB中的一些常用语句,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • mac下安装和配置mongodb的步骤详解

    mac下安装和配置mongodb的步骤详解

    大家都知道MongoDB是一个跨平台的,面向文档的数据库,提供高性能,高可用性和可扩展性方便。那么下面这篇文章就来给大家介绍了关于在mac系统下安装和配置mongodb的方法步骤,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-07-07
  • Windows系统下安装Mongodb 3.2.x的步骤详解

    Windows系统下安装Mongodb 3.2.x的步骤详解

    mongodb3.x版本有好多新功能,关于这方面参考官网即可,下面这篇文章主要给大家介绍了在Windows系统下安装Mongodb 3.2.x的详细步骤,文中介绍的非常详细,需要的朋友们可以参考学习,下面来一起看看吧。
    2017-03-03
  • MongoDB存储时间时差问题的解决方法

    MongoDB存储时间时差问题的解决方法

    这篇文章主要给大家介绍了关于MongoDB存储时间时差问题的解决方法,文中通过示例代码介绍的非常详细,对大家学习或者使用mongodb具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-09-09
  • CentOS 7系统下SELinux阻止MongoDB启动的问题详解

    CentOS 7系统下SELinux阻止MongoDB启动的问题详解

    这篇文章主要给大家介绍了关于CentOS 7系统下SELinux阻止MongoDB启动问题的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-11-11

最新评论

?


http://www.vxiaotou.com