在服务器端,我们可以执行Javascript脚本,通过db.eval功能,或在数据库中保存的Javascript脚本,然后调用它在其他数据库命令。



1。db.eval执行服务器端脚本

的db.eval函数可以用来在服务器端执行Javascript脚本mondb。该函数首先传递给Javascript字符串的mondb服务器,在服务器上执行,并返回结果。

db.eval可以用来模拟多文档交易:db.eval锁的数据库,然后执行Javascript然后解锁。虽然没有内置的回滚机制,但它可以确保以指定的数字顺序执行一系列操作。

有两种方法可以发送代码、封装函数或不封装,例如:

复制代码代码如下所示:

db.eval(return'refactor;)

db.eval(功能(){ return'refactor;} )



只有当参数传递时,它必须被封装到一个函数中。参数是通过对db.eval二参数和写一个数组。

如:

复制代码代码如下所示:

db.eval(功能(name){ return'hello,' +姓名;}



如果db.eval表达复杂,调试方法是编写调试信息写入日志的日志

如:

复制代码代码如下所示:

db.eval(打印('Hello重构))



So you can find Hello refactor in the log



两。商店的Javascript



每个mondb数据库有一个特殊的集合:system.js,用来存储Javascript变量。这些变量可以在任何mondb的Javascript上下文调用,包括美元的WHERE子句,db.eval电话,MapReduce的工作。插入可以存在于system.js。

如:

复制代码代码如下所示:

Db.system.js.insert({_id X

Db.system.js.insert({_id Y

Db.system.js.insert({_id Z



在全局范围z中的x,y的定义:

db.eval(返回x + y + z;)



system.js可以存储的Javascript代码,这样你可以很容易地定制一些脚本,如用Javascript写日志功能,存储在system.js。

复制代码代码如下所示:

Db.system.js.insert(

{

_id :日志

值:函数(MSG,级别)

{

var级别=调试

水平= levellevel:0;

var现在=新日期();

打印(现在+ +)+级别;

}

}

)



呼叫:

复制代码代码如下所示:

db.eval(日志('refactor博客测试',1))



使用存储Javascript的缺点是,代码将与常规源代码控件和Javascript分开。会被客户搞砸的。

最适合存储javascript的程序是使用javascript函数的程序,所以如果更新,只需要更新这个函数,而不是修改。如果javascript代码使用起来非常冗长乏味,也可以使用javascript存储,这将节省大量的传输时间。



三。安全



对mondb安全应在Javascript代码的执行是。

如:

复制代码代码如下所示:

>功能= 的功能()(){打印(你好,+用户名+ !;}。



如果用户名是用户定义的,你可以使用这样的字符串);db.dropdatabase();打印(',',

代码变成了这个:

复制代码代码如下所示:

>功能= 的功能()(){打印(你好,);db.dropdatabase();打印('!)



为了避免这种情况,限制行动范围。

大多数驱动程序都提供了一种特殊的类型,传递给数据库代码,这是因为代码实际上可以看作是字符串和范围的组合。作用域是保存的变量名和值映射文档。当执行Javascript函数时,映射将成为函数的局部作用域。