存儲過程
關系型數據庫的存儲過程描述為:一組為了完成特定功能的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