mongo 存儲過程詳解

存儲過程

關係型數據庫的存儲過程描述爲: 一組爲了完成特定功能的SQL 語句集,經編譯後存儲在數據庫中,用戶經過指定存儲過程的名字並給出參數(若是該存儲過程帶有參數)來執行它 。javascript

MongoDB 爲不少問題提供了一系列的解決方案,針對於其它數據庫的特性,它仍然絕不示 弱,表現的非比尋常。MongoDB 一樣支持存儲過程,但mongoDB是用javascript來寫的 ,這正是mongoDB的魅力。java

MongoDB 一樣支持存儲過程。關於存儲過程你須要知道的第一件事就是它是用 javascript 來寫的。也許這會讓你很奇怪,爲何它用 javascript 來寫,但實際上它會讓你很是滿意,MongoDB 存儲過程是存儲在 db.system.js 表中的mongodb

例如:

計算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();json

在這裏插入圖片描述

執行結果

總數bash

db.eval('findTotal()');服務器

在這裏插入圖片描述

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

在這裏插入圖片描述

mongodb 執行存儲過程

mongodb 存儲過程是用js語言寫的,java調用js腳本便可!ui

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或者「」 否則會異常!this

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命令執行存儲過程。

相關文章
相關標籤/搜索