關係型數據庫的存儲過程描述爲: 一組爲了完成特定功能的SQL 語句集,經編譯後存儲在數據庫中,用戶經過指定存儲過程的名字並給出參數(若是該存儲過程帶有參數)來執行它 。javascript
MongoDB 爲不少問題提供了一系列的解決方案,針對於其它數據庫的特性,它仍然絕不示 弱,表現的非比尋常。MongoDB 一樣支持存儲過程,但mongoDB是用javascript來寫的 ,這正是mongoDB的魅力。java
MongoDB 一樣支持存儲過程。關於存儲過程你須要知道的第一件事就是它是用 javascript 來寫的。也許這會讓你很奇怪,爲何它用 javascript 來寫,但實際上它會讓你很是滿意,MongoDB 存儲過程是存儲在 db.system.js 表中的mongodb
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" : [ ]
})
複製代碼
能夠將存儲過程邏輯直接在裏面定義而且 同時調用,無需事先聲明!數據庫
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 存儲過程是用js語言寫的,java調用js腳本便可!ui
/** * 調用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);
}
複製代碼
接口 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命令執行存儲過程。