MongoDB为很多问题提供了一系列的解决方案,针对其他数据库的特性,它任然奥不示弱,表现得非比寻常,MongoDB同样支持存储过程。存储过程使用JavaScript来写的。MongoDB存储过程是存储在db.system.js表中的。例如,一个简单的SQL自定义函数如下:
function addNum( x , y ) {
return x + y;
}
下面我们将这个sql自定义的函数转换成为MongoDB的存储过程,代码如下:
> db.system.js.save({"_id" : "addNum",
...value : function(x, y){
...return x + y
}})
存储过程可以被查看,修改和删除,所以我们用find 来查看一下是否这个存储过程已经被创建上了,代码如下:
> db.system.js.find()
{
"_id" : "addNum",
"value" : function cf__1__f_(x, y) {
return x + y;
}
}
>
下面我们来实际调用一下这个存储过程,代码如下:
> db.eval('addNum(6,5.2)')
11.2
>
db.eval()是一个比较奇怪的东西,我们可以将存储过程的逻辑直接在里面并同时调用,而无需事先声明存储过程的逻辑:
> db.eval( function() { return 6+2; } )
8
>
从上面我们可以看出,MongoDB的存储过程可以方便的完成算数运算,但其他数据库产品在存储过程中可以处理数据库中的一些事情,例如,取出某个集合的数据量等。这些MongoDB能做到吗?答案是坑定的,MongoDB可以轻而易举的做到,看下面的实例:
例如,test集合中数据如下:
> db.test.find()
{ "_id" : ObjectId("4f770ecd44c9688d7f058666"), "x" : 0 }
{ "_id" : ObjectId("4f770ecd44c9688d7f058667"), "x" : 1 }
{ "_id" : ObjectId("4f770ecd44c9688d7f058668"), "x" : 2 }
{ "_id" : ObjectId("4f770ecd44c9688d7f058669"), "x" : 3 }
{ "_id" : ObjectId("4f770ecd44c9688d7f05866a"), "x" : 4 }
{ "_id" : ObjectId("4f770ecd44c9688d7f05866b"), "x" : 5 }
{ "_id" : ObjectId("4f770ecd44c9688d7f05866c"), "x" : 6 }
{ "_id" : ObjectId("4f770ecd44c9688d7f05866d"), "x" : 7 }
{ "_id" : ObjectId("4f770ecd44c9688d7f05866e"), "x" : 8 }
{ "_id" : ObjectId("4f770ecd44c9688d7f05866f"), "x" : 9 }
>
写一个统计test集合数据量的存储过程,代码如下:
> db.system.js.save({"_id" : "getCount",
..."value" : function(){
...return db.test.count()
...}})
>
调用存储过程,代码如下:
> db.eval('getCount()')
10
>
参考《深入云计算:MongoDB管理与开发实战详解》