mongo 之存储过程

存储过程

关系型数据库的存储过程描述为: 一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它 。

MongoDB 为很多问题提供了一系列的解决方案,针对于其它数据库的特性,它仍然毫不示 弱,表现的非比寻常。MongoDB 同样支持存储过程,但mongoDB是用javascript来写的 ,这正是mongoDB的魅力。

MongoDB 同样支持存储过程。关于存储过程你需要知道的第一件事就是它是用 javascript 来写的。也许这会让你很奇怪,为什么它用 javascript 来写,但实际上它会让你非常满意,MongoDB 存储过程是存储在 db.system.js 表中的

例如:

计算x+y的值

function test(x,y){

return x+y;
}

定义查询总数 存储过程

function findTotal(){
return db.user.find().count();
}

编译保存

db.system.js.save({"_id":"test","value":function test(x,y){return x+y;}});
db.system.js.save({"_id":"findTotal","value":function findTotal(){return db.user.find().count();})

执行返回

// 1
WriteResult({
    "nMatched" : 1,
    "nUpserted" : 0,
    "nModified" : 0,
    "writeConcernError" : [ ]
})

eval 函数

可以将存储过程逻辑直接在里面定义并且 同时调用,无需事先声明!

db.eval("function test(x,y){return 2 + 4;}");  // 6 
查询表中的数据总数
db.eval("function total(){ return db.user.find().count();}");  //25

查看所有的存储过程

db.system.js.find();

在这里插入图片描述

执行结果

总数

db.eval('findTotal()');

在这里插入图片描述

db.eval('test(2,4)');

在这里插入图片描述

mongodb 执行存储过程

mongodb 存储过程是用js语言写的,java调用js脚本即可!

java 执行js脚本文件:

/**
 * 调用mongodb存储过程 js脚本文件
 * @return
 */
@Test
public void test(){
    ScriptOperations scriptOps = mongoTemplate.scriptOps();
    Object findTotal = scriptOps.call("findTotal");//执行服务器端脚本
    //call(String script,Object...args)参数放在脚本名称之后
    Object test = scriptOps.call("test",4,4);//执行服务器端脚本

    System.out.println(Double.parseDouble(findTotal.toString()));  //25条
    System.out.println(Double.parseDouble(test.toString()));       // 8 
 
}

注意script脚本不能为null或者“” 不然会异常!

mongoTemplate 中方法返回DefaultScriptOperations对象:

MongoTemplate 实现 MongoOperations接口

MongoTemplate 中方法

public ScriptOperations scriptOps() {
    return new DefaultScriptOperations(this);
}
call方法

接口 ScriptOperations

@Nullable
Object call(String var1, Object... var2);

实现类:

class DefaultScriptOperations 实现ScriptOperations 接口

构造方法

public DefaultScriptOperations(MongoOperations mongoOperations) {
    Assert.notNull(mongoOperations, "MongoOperations must not be null!");
    this.mongoOperations = mongoOperations;
}

方法

public Object call(final String scriptName, final Object... args) {
    Assert.hasText(scriptName, "ScriptName must not be null or empty!");
    return this.mongoOperations.execute(new DbCallback<Object>() {
        public Object doInDB(MongoDatabase db) throws MongoException, DataAccessException {
            return db.runCommand(new Document("eval", String.format("%s(%s)", scriptName, DefaultScriptOperations.this.convertAndJoinScriptArgs(args)))).get("retval");
        }
    });
}

通过调用scriptOps()方法返回MongoOperations引用 ,实际上还是mongoTemplate去执行execute方法
是在 ScriptOperations接口的实现类中DefaultScriptOperations 调用 ScriptOperations接口的call方法,最后根据DefaultScriptOperations 类中的去其他方法 convertAndJoinScriptArgs 传递验证参数类型以及转换。
最后调用最底层runCommand命令执行存储过程。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容