1

node.js クライアントから、MongoDB サーバーで JavaScript コードを実行する方法を見つけました。

db.eval("function(x){ return x*10; }", 1, function (err, retval) {
  console.log('err: '+err);
  console.log('retval: '+retval);
});

そして、それはうまくいきます。しかし、ドキュメントによるとdb.eval()、それは書き込みロックを発行するため、データベースに対して他に何も読み書きできません。私はそれを望んでいません。

またeval、そのような制限はないと言っていますが、どこにあるのかわかりません。彼らが話している方法から、正規evalはmongoシェルでのみ利用可能であり、クライアント側からは利用できないようです。

では、すべてをブロックすることなく、mongodb サーバーでこれらのストアド プロシージャを実行するにはどうすればよいでしょうか。

4

2 に答える 2

1

オプションの 3 番目のパラメータとして true に設定されたフィールド nolock を持つオブジェクトを eval に渡すことができます。

db.eval('function (x) {return x*10; }', [1], {nolock:true}, function(err, retval) {
     console.log('err: '+err);
     console.log('retval: '+retval);
});

これにより、 eval が必須の書き込みロックを設定することはできなくなりますが、関数内の操作が独自に書き込みロックを作成することは妨げられないことに注意してください。

出典:ドキュメント.

この場合、「ストアド プロシージャ」という用語は間違っていることに注意してください。ストアド プロシージャとは、データベース自体に格納され、アプリケーション層によって配信されないコードを指します。MongoDB は特別なコレクションdb.system.jsを利用してこれを行うこともできますが、これを行うことは推奨されません: http://docs.mongodb.org/manual/applications/server-side-javascript/#storing-functions-server-side

ところで、MongoDB はストアド プロシージャ用に設計されていません。通常、アプリケーション層に高度なロジックを実装することをお勧めします。SQL データベースで時々行われるように、些細な操作をストアド プロシージャとして実装することはお勧めできません。

于 2013-03-27T20:20:49.457 に答える
0

これは、関数をサーバー側に格納する方法であり、以下に示すように使用します。

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

db.system.js.find()

{ "_id" : "myAddFunction", "value" : function (x,y){ return x + y; } }


db.eval( "myAddFunction( 1 ,2)" )
3
于 2013-03-27T20:32:25.343 に答える