《MongoDB管理与开发精要》——3.4节游标和存储过程

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介: 本节书摘来自华章社区《MongoDB管理与开发精要》一书中的第3章,第3.4节游标和存储过程,作者:红 丸,更多章节内容可以访问云栖社区“华章社区”公众号查看

3.4 游标和存储过程
游标是系统为用户开设的一个数据缓冲区,用来存放SQL语句的执行结果。在数据库中,游标是一个十分重要的概念,游标提供了一种对从表中检索出的数据进行操作的灵活手段。
存储过程是一组为了完成特定功能的操作语句集,它可以经编译后存储在数据库中。存储过程是数据库中的一个重要对象,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
3.4.1 游标
每个游标区都有一个名字,用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理。游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。
跟大多数数据库产品一样,MongoDB也是用游标来循环处理每一条结果数据,具体语法如下面的代码所示:

> for( var c = db.t3.find(); c.hasNext(); ) {
...    printjson( c.next());
... }
{ "_id" : ObjectId("4fb8e4838b2cb86417c9423a"), "age" : 1 }
{ "_id" : ObjectId("4fb8e4878b2cb86417c9423b"), "age" : 2 }
{ "_id" : ObjectId("4fb8e4898b2cb86417c9423c"), "age" : 3 }
{ "_id" : ObjectId("4fb8e48c8b2cb86417c9423d"), "age" : 4 }
{ "_id" : ObjectId("4fb8e48e8b2cb86417c9423e"), "age" : 5 }

在本例中,首先声明了一个游标c,代表t3表的所有记录,通过c.hasNext方法判断是否还有数据,然后将找到的数据通过c.next方法取出来,最后通过printjson方法将结果输出。
MongoDB还有另一种forEach方式来处理游标,如下面的代码所示:

> db.t3.find().forEach( function(u) { printjson(u); } );
{ "_id" : ObjectId("4fb8e4838b2cb86417c9423a"), "age" : 1 }
{ "_id" : ObjectId("4fb8e4878b2cb86417c9423b"), "age" : 2 }
{ "_id" : ObjectId("4fb8e4898b2cb86417c9423c"), "age" : 3 }
{ "_id" : ObjectId("4fb8e48c8b2cb86417c9423d"), "age" : 4 }
{ "_id" : ObjectId("4fb8e48e8b2cb86417c9423e"), "age" : 5 }
>

这两种处理方式实现的结果是一样的,都是要返回t3表的所有数据,只是语法上略有不同。
3.4.2 存储过程
MongoDB为很多问题提供了一系列的解决方案,面对其他数据库的特性,它仍然毫不示弱,表现得非比寻常。MongoDB同样支持存储过程。
存储过程可由应用程序通过一个调用来执行,而且允许用户声明变量 。同时,存储过程可以接收和输出参数、返回执行存储过程的状态值,也可以嵌套调用。关于存储过程你需要知道的第一件事就是它是用JavaScript来写的。也许这会让你很奇怪,为什么用JavaScript来写,但实际上它会让你非常满意。
MongoDB存储过程存储在db.system.js表中,想象一个简单的SQL自定义函数如下面的代码所示:

function addNumbers( x , y ) {
    return x + y;
}

本例中声明了一个存储过程addNumbers,实现的功能是加法计算,它接收2个参数,都代表被加数,最后返回一个相加后的结果。
将这个SQL自定义函数转换为MongoDB的存储过程,只需要调用db.system.js.save命令即可,它接收2个参数,参数_id代表存储过程的名字,参数value代表存储过程的定义,如下面的代码所示:

> db.system.js.save({_id:"addNumbers", value:function(x, y){ return x + y; }});

存储过程可以被查看、修改和删除,用find来查看是否这个存储过程已经被创建,如下面的代码所示:

> db.system.js.find()
{ "_id" : "addNumbers", "value" : function cf__1__f_(x, y) {
    return x + y;
} }
>

在本例中通过执行“db.system.js.find”命令获得了系统中存储的存储过程列表,下面来实际调用这个存储过程,如下面的代码所示:

> db.eval('addNumbers(3, 4.2)');
7.2
>

通过执行“db.eval”命令调用加法计算的接口,这样的操作方法太简单了,也许这就是MongoDB的魅力所在。
db.eval()是一个比较奇怪的东西,可以将存储过程的逻辑直接放在db.eval()的参数里直接调用,而无需事先声明存储过程的逻辑,如下面的代码所示:

> db.eval( function() { return 3+3; } );
6
>

从上面代码可以看出,MongoDB的存储过程可以方便地完成算术运算,但其他数据库产品在存储过程中可以处理数据库内部的一些事情。例如,取出某张表的数据量等操作,这些MongoDB能做到吗?答案是肯定的,MongoDB可以通过在存储过程的定义里写上表级别来实现,如下面的代码所示:

> db.system.js.save({_id:"get_count", value:function(){ 
      return db.c1.count(); }});
> db.eval('get_count()')

2
本例中通过定义一个存储过程“get_count”来统计c1表的记录条数。可以看到,存储过程可以很轻松地操作表。
综上所述,存储过程有如下优点:

  • 存储过程用流控制语句编写,有很强的灵活性,可以完成复杂的判断和运算。
  • 通过存储过程可以使相关的动作同时发生,从而维护数据库的完整性。
  • 降低网络的通信量。
    当企业规则发生变化时,只在服务器中改变存储过程即可,无需修改任何应用程序。企业规则的特点是要经常变化,如果把体现企业规则的运算程序放入应用程序中,当企业规则发生变化时,就需要修改应用程序,工作量非常大(修改、发行和安装应用程序)。如果把体现企业规则的运算放入存储过程中,当企业规则发生变化时,只要修改存储过程就可以了,应用程序无需任何变化。
相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
3天前
|
存储 SQL 数据库
数据库sql语句-----游标和存储过程
数据库sql语句-----游标和存储过程
14 1
|
3天前
|
人工智能 NoSQL atlas
Fireworks AI和MongoDB:依托您的数据,借助优质模型,助力您开发高速AI应用
我们欣然宣布MongoDB与 Fireworks AI 正携手合作让客户能够利用生成式人工智能 (AI)更快速、更高效、更安全地开展创新活动
1640 1
|
3天前
|
存储 SQL Oracle
02-PostgreSQL 存储过程的进阶介绍(含游标、错误处理、自定义函数、事务)
02-PostgreSQL 存储过程的进阶介绍(含游标、错误处理、自定义函数、事务)
|
3天前
|
存储 SQL 关系型数据库
MySQL存储过程 if、case、while、loop、游标、变量、条件处理程序
MySQL存储过程 if、case、while、loop、游标、变量、条件处理程序
53 0
|
3天前
|
存储 SQL Oracle
|
3天前
|
存储 SQL 定位技术
数据库基础(六):T-SQL语言程序设计、游标定义与使用及存储过程创建与信息查找
数据库基础(六):T-SQL语言程序设计、游标定义与使用及存储过程创建与信息查找
|
3天前
|
存储 NoSQL MongoDB
MongoDB 助力移动式汽车保养运营模式优化,将开发请求减少 90%
MongoDB针对初级,中级及熟练的技术开发人员推出系列技术文章与行业案例。深入浅出地剖析MongoDB产品基础原理,使用技巧,典型行业场景及应用,还有Code Demo及线上线下活动推荐!
4857 1
MongoDB 助力移动式汽车保养运营模式优化,将开发请求减少 90%
|
3天前
|
存储 SQL 关系型数据库
⑩⑤【DB】详解MySQL存储过程:变量、游标、存储函数、循环,判断语句、参数传递..
⑩⑤【DB】详解MySQL存储过程:变量、游标、存储函数、循环,判断语句、参数传递..
49 0
|
3天前
|
存储 NoSQL 算法
国泰航空利用MongoDB和Device Sync开发飞机上的移动应用
作为中国香港本土的航空公司,国泰航空提供的客运和货运服务覆盖全球不同目的地。国泰航空清楚这个流程及其他许多关键业务级流程都需要进行数字化转型。国泰航空积极寻找可提高其运营效率、工作效率和可持续性能力的重大机会,优先开发创新性的数字解决方案。
国泰航空利用MongoDB和Device Sync开发飞机上的移动应用