mongodb 存储过程
存储过程可以说是在SQL中非常的关键,突然换到mongodb,尽管有很多的优势,但是在表间的关联是的确不如从前了,JS可以说在某种程度上弥补了这一遗憾。
比如函数:
db.system.js.save({_id:"add",value:function(x,y){pint(x+y);}});
调用方式:
db.eval('add(3,4)')
ok,在编写完getIndexJs的函数发生了问题
WARNING: db.eval is deprecated
Error: {
"ok" : 0,
"errmsg" : "not authorized on admin to execute command { $eval: \"getIndexJs('2007_0020')\" }",
"code" : 13
} :
_getErrorWithCode@src/mongo/shell/utils.js:23:13
DB.prototype.eval@src/mongo/shell/db.js:553:1
@(shell):1:1
一、WARNING: db.eval is deprecated
查询官方文件,当使用db.eval会生成一个全局锁,即将整个数据库锁住,阻止其他的读写操作。
官网建议如果是长时间使用db.eval,就应该考虑使用其他的非锁的操作函数。不过没有找到对应的替代函数,只能先用它了。
二、"not authorized on admin to execute command
这句话告诉我,无权限调用eval函数,是的,在使用分片及副本集的时候,我开启了keyFile选项,对于权限管理见下一篇。
所以需要的操作是给当前的用户添加权限,能够执行eval函数。
参照网友的说法,先创建一个role,赋予特殊权限,这个特殊权限拥有所有的数据库的所有操作:
db.createRole(
role:'adminJs',
role:[],
privileges:[
{resource:{anyResource:
true
},actions:[
'anyAction'
]}
]
)
db.grantRolesToUser('sup',roles:
[{
role:'adminJs',db:'admin'
}])
那么这样,我就在当前的权限下添加了新的角色,再次调用就不会有问题。
其实使用mongoChef就非常的方便
存储过程的要点是要了解JS函数