mongoDB存儲過程


存儲過程

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

mongoDB也有存儲過程,但是mongoDB是用javascript來寫的,這正是mongoDB的魅力。

保存存儲過程

mongodb的存儲過程是存放在db.system.js表中,我們先來一個簡單的例子:

1 function add(x,y){  
2     return x+y;  
3 }  

現在我們將這個存儲過程保存到db.system.js的表中:

創建存儲過程代碼

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

其中:_id和value屬性是必須的,如果沒有_id這個屬性,會導致以后無法調用(到目前為止我還沒有找到調用的方式方法,如果大家有什么辦法,請回復我。)。你可以增加其他的屬性來描述這個存儲過程。比如:

1 > db.system.js.save({"_id":"myAdd1",value:function add(x,y){ return x+y; },"discrption":"x is number ,and y is number"});  

增加了discrption來描述這個函數。

查詢存儲過程

可以使用find來查詢存儲過程,和之前MongoDB查詢文檔中描述一樣例如:

查詢存儲過程代碼

 1 //直接查詢所有的存儲過程  
 2 > db.system.js.find();  
 3 { "_id" : "myAdd", "value" : function __cf__13__f__add(x, y) {  
 4     return x + y;  
 5 } }  
 6 { "_id" : "myAdd1", "value" : function __cf__14__f__add(x, y) {  
 7     return x + y;  
 8 }, "discrption" : "x is number ,and y is number" }  
 9 { "_id" : ObjectId("5343686ba6a21def9951af1c"), "value" : function __cf__15__f__  
10 add(x, y) {  
11     return x + y;  
12 } }  
13 //查詢_id為myAdd1的存儲過程  
14 > db.system.js.find({"_id":"myAdd1"});  
15 { "_id" : "myAdd1", "value" : function __cf__16__f__add(x, y) {  
16     return x + y;  
17 }, "discrption" : "x is number ,and y is number" }  
18 >  

執行存儲過程

保存好的存儲是如何執行的呢?

這里有個牛逼的函數,eval;如果對js了解的人肯定知道這個eval。用來執行一段字符串(描述的比較膚淺,呵呵),在mongodb中使用db.eval("函數名(參數1,參數2...)"),來執行存儲過程(函數名找的是_id):

執行存儲過程代碼

1 > db.eval('myAdd(1,2)');  
2 3 

eval會找到對應_id屬性執行存儲過程。

db.eval()是一個比較奇怪的東西,我們可以將存儲過程的邏輯直接在里面並同時調用,而無需事先聲明存儲過程的邏輯。

執行存儲過程代碼

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM