0

我可以从服务器端编写一个过程,稍后将其存储在 Db 中并用于进一步的事务。

如果是的话,你能给我一个示例代码,展示如何在java中从服务器端编写js。

4

3 回答 3

2

我可以从服务器端编写一个过程,稍后将其存储在 Db 中并用于进一步的事务。

不,但正如@Philipp 所说,您可以编写一个 JavaScript 块,该块将在 MongoDB 的 JavaScript 引擎中进行评估(spidermonkey atm 除非您使用 V8 编译)。

我应该清楚这不是一个存储过程,它不像 SQL 过程那样运行“服务器端”。

您还必须注意 JS 引擎是单线程和 eval(使用时)锁,以及大约一吨的其他问题。

实际上,在系统集合中存储函数的全部能力就是为 MR 等任务存储重复代码。

于 2012-12-12T14:14:06.390 回答
1

可以这样做,但 10gen 建议您不要这样做。Javascript 函数可以存储在特殊集合 system.js 中,并通过 eval 命令调用。

这篇文章的其余部分是从官方文档中复制和粘贴的:http ://www.mongodb.org/display/DOCS/Server-side+Code+Execution#Server-sideCodeExecution-Storingfunctionsserverside


注意:我们建议尽可能不要使用服务器端存储的函数。由于这些是代码,因此最好将它们与其余代码一起存储在版本控制系统中。

有一个名为 system.js 的特殊系统集合,可以存储要重用的 JavaScript 函数。要存储一个函数,你会这样做:

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

_id 是函数的名称,并且每个数据库都是唯一的。一旦你这样做了,你就可以从任何 JavaScript 上下文(db.eval、$where、map/reduce)中使用 foo 下面是一个来自 shell 的示例:

> db.system.js.save({ "_id" : "echo", "value" : function(x){return x;} })
> db.eval("echo('test')")
test

有关完整示例,请参阅http://github.com/mongodb/mongo/tree/master/jstests/storefunc.js。在 MongoDB 2.1 中,您还可以使用 db.loadServerScripts() 将 db.system.js 中保存的所有脚本加载到 shell 中

>db.loadServerScripts()
>echo(3)
3
于 2012-12-12T14:09:52.450 回答
0

那么你可以使用morphia。它是 Java 中 mongo 的 ODM。我知道它不像您想要的那种 PL/SQL 解决方案。但是 mongo 没有像 Oracle 或 SQL Server 那样广泛支持约束或触发器。验证和其他东西需要通过代码来完成。ODM 之类的 Java 中的 Morphia、Node.js 中的 Mongoose 或 Python 中的 Mongoengine 都是相当不错的新兴库,您可以将它们用于此类任务,但这些限制在应用程序方面。

于 2012-12-12T14:04:45.660 回答