0

後でデータベースに格納され、さらなるトランザクションに使用されるサーバー側からのプロシージャを作成できますか。

はいの場合は、Java でサーバー側から js を記述する方法を示すサンプル コードを提供していただけますか。

4

3 に答える 3

2

後でDbに保存され、以降のトランザクションに使用されるサーバー側からプロシージャを記述できますか?

いいえ。ただし、@ Philippが述べているように、MongoDBのJavaScriptエンジンのbult内で評価されるJavaScriptのブロックを作成できます(spidermonkey atmはV8でコンパイルすることを許可します)。

これはストアドプロシージャではなく、SQLプロシージャのように「サーバーサイド」を実行しないことを明確にする必要があります。

また、JSエンジンはシングルスレッドで評価(使用する場合)のロックであり、その他にも約1トンの問題があることに注意する必要があります。

実際、関数をシステムコレクションに格納する機能全体は、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


注: 可能であれば、サーバー側のストアド関数を使用しないことをお勧めします。これらはコードであるため、残りのコードと一緒にバージョン管理システムに保存することをお勧めします。

再利用する JavaScript 関数を格納できる、system.js と呼ばれる特別なシステム コレクションがあります。関数を保存するには、次のようにします。

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

_id は関数の名前で、データベースごとに一意です。これを行うと、任意の JavaScript コンテキスト (db.eval、$where、map/reduce) から foo を使用できます。シェルの例を次に示します。

> 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 に保存されたすべてのスクリプトをシェルにロードすることもできます。

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

まあ、あなたはモルフィアを使うことができます。Java の mongo の ODM です。あなたがまさに望んでいるPL/SQLのようなソリューションではないことはわかっています。しかし、mongo には、Oracle や SQL Server のような制約やトリガーに対する広範なサポートはありません。検証などはコードで行う必要があります。Java の Morphia、Node.js の Mongoose、Python の Mongoengine などの ODM は、このようなタスクに使用できる非常にまともな新しいライブラリですが、これらの制約はアプリ側にあります。

于 2012-12-12T14:04:45.660 に答える