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

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 本节书摘来自华章社区《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
相关文章
|
1月前
|
存储 人工智能 NoSQL
使用 MongoDB 构建 AI:Gradient Accelerator Block 如何在几秒钟内让您从零开发 AI
借助 MongoDB,开发者可以存储任何结构的数据,然后使用单一查询 API 和驱动程序将这些数据用于 OLTP、文本搜索和向量搜索处理。
|
6月前
|
存储 SQL 数据库
数据库sql语句-----游标和存储过程
数据库sql语句-----游标和存储过程
53 1
|
5月前
|
JSON NoSQL MongoDB
Rockmongo详解:高效管理MongoDB的图形化利器
Rockmongo详解:高效管理MongoDB的图形化利器
108 0
|
3月前
|
存储 NoSQL JavaScript
MongoDB存储过程实战:聚合框架、脚本、最佳实践,一文全掌握!
【8月更文挑战第24天】MongoDB是一款备受欢迎的文档型NoSQL数据库,以灵活的数据模型和强大功能著称。尽管其存储过程支持不如传统关系型数据库,本文深入探讨了MongoDB在此方面的最佳实践。包括利用聚合框架处理复杂业务逻辑、封装业务逻辑提高复用性、运用JavaScript脚本实现类似存储过程的功能以及考虑集成其他工具提升数据处理能力。通过示例代码展示如何创建订单处理集合并定义验证规则,虽未直接实现存储过程,但有效地演示了如何借助JavaScript脚本处理业务逻辑,为开发者提供更多实用指导。
71 2
|
3月前
|
开发框架 NoSQL 关系型数据库
基于SqlSugar的开发框架循序渐进介绍(27)-- 基于MongoDB的数据库操作整合
基于SqlSugar的开发框架循序渐进介绍(27)-- 基于MongoDB的数据库操作整合
|
5月前
|
存储 SQL 关系型数据库
MySQL存储过程_触发器_游标——Baidu Comate
MySQL存储过程_触发器_游标——Baidu Comate
40 0
|
6月前
|
人工智能 NoSQL atlas
Fireworks AI和MongoDB:依托您的数据,借助优质模型,助力您开发高速AI应用
我们欣然宣布MongoDB与 Fireworks AI 正携手合作让客户能够利用生成式人工智能 (AI)更快速、更高效、更安全地开展创新活动
2767 1
|
5月前
|
存储 JSON NoSQL
MongoDB 插入文档:轻松管理数据录入与批量导入
MongoDB 插入文档:轻松管理数据录入与批量导入
|
5月前
|
存储 关系型数据库 MySQL
MySQL数据库——存储过程-游标(介绍-声明游标、打开游标、获取游标记录、关闭游标,案例)
MySQL数据库——存储过程-游标(介绍-声明游标、打开游标、获取游标记录、关闭游标,案例)
235 0
|
5月前
|
存储 关系型数据库 MySQL
mysql 存储过程游标 循环输出select 查询结果
mysql 存储过程游标 循环输出select 查询结果
112 0
下一篇
无影云桌面