6

サーバーサイド JavaScript を実行すると、MongoDB でパフォーマンスの問題が発生しますか? V8 は前述のパフォーマンスの問題を解決しますか?

MongoDB のドキュメントでサーバー側関数を使用しないことが推奨されているのはなぜですか?

4

2 に答える 2

9

サーバーサイド JavaScript の実行可能性について質問する場合、まず、どのような種類のサーバーサイド JavaScript について話しているのかを明確にする必要があります。ドキュメントによると、サーバー側のコード実行には 4 つの異なる種類があります。残念ながら、これらはすべて、ネイティブ API が不十分な状況に対するハック的な回避策です。

評価コマンド_

eval には、1 つのノードでしか実行できないという欠点があります。これにより、クラスター環境での有用性が大幅に低下します。シャードされたコレクションでは、まったく機能しません!

デフォルトでは、スクリプトが実行されるまでデータベースを完全に使用できないようにするグローバル ロックも作成されます。これは、引数で防ぐことができnolockます (スクリプト自体がグローバル ロックを作成する何かを実行しない限り)。

Sammaye による回答は、いくつかの深刻なセキュリティ上の懸念についても説明しています。

これは、通常の操作に使用する必要があるものというよりも、実際にはテストおよび管理ツールです。

サーバー上の mongo shell インスタンスを介して .js ファイルを実行する

この場合、コードはデータベースではなく、いずれかのサーバー上の別の独立したプロセスで実行されます。これは、スクリプトによって実際に何が返されるかに関係なく、他のシャードから必要なすべてのデータを、JavaScript コードを実行するサーバーに転送する必要があることを意味します。

mongodb サーバーには別のアプリケーションとして表示されるため、通常のアプリケーション内では実行できないことは何も実行できません。これは、通常の運用では使用すべきではない、もう 1 つのテストおよび管理ツールです。

$where演算子で検索

find-command の $where 演算子を使用すると、値のフィルタリングに使用される JavaScript 関数を渡すことができます。ほとんどの些細なケースでは、特にインデックスを使用できないため、検索クエリの他のツールが提供する必要があるものよりもパフォーマンスが大幅に低下します。

$where の使用を避けることができない場合は、少なくとも検索クエリの通常のツールを使用して、$where 関数に渡す必要があるドキュメントのセットを減らすようにしてください。

MapReduce

MapReduce は、2 つの JavaScript 関数を使用して集計データを作成します。以前は MongoDB の主要なデータ マイニング ツールでしたが、通常のユースケースのほとんどは、より使いやすい集計フレームワークによって実現されています。

また、$where と同じ欠点もあります。フィルタリングしないと、ドキュメントごとに 1 つではなく、少なくとも 2 つの JavaScript 関数を実行する必要があります。

ただし、MapReduce は少なくとも分散して実行でき、並列化も可能です。

tl;dr:

Javascript の使用は、通常のクエリ言語では作成できず、アプリケーションに実装するにはあまりにも多くのデータにアクセスする必要がある、非常に特殊なクエリに対する最後の手段です。可能であれば、利用可能な専用ツールを使用してやりたいことを行うか、アプリケーション層にロジックを実装してください。

于 2013-07-09T14:53:47.570 に答える
3

ドキュメント内では、MongoDB 内でストアド JavaScript プロシージャを使用しないことが推奨されています。

私はまだそれを「サーバー側」と呼ぶことを拒否しています。これは、MongoDB では機能しないが「サーバー側」で機能することを示しているためです。これらはストアド プロシージャではありません。

とにかく、デフォルトで JavaScript 関数はグローバル ロックを取得します。これはnolockV8 (2.4 以降のデフォルト) で軽減でき、マルチスレッド化できます。これは使用できるように見えますが、他にも問題があります。

  • eval はレプリカ セットのプライマリで実行され、プライマリのみで実行されます
  • eval はまだシャードされたコレクションでは機能しません
  • eval は、認証を有効にして実行するための完全な管理者アクセス権を持っている必要があります (これは、アプリケーションで管理者ユーザーを使用することを意味します)
  • eval は自己完結型の JavaScript 環境で実行され、管理者アクセスで実行するとデータベースに完全にアクセスできます。それ自体が、主に私のシステムを内部から侵害するために使用される可能性のある癖のために、私に警鐘を鳴らします.

正直なところ、V8 の変更により、Map Reduce などにいくらかの素晴らしい機能が追加されましたが、ストアド プロシージャをストアド JavaScript 関数に置き換える試みに関しては、あまり変わったとは言えません。

追加のメモとして: http://docs.mongodb.org/manual/reference/command/eval/#dbcmd.eval警告ボックスは、これを試みないようにする必要があります。

于 2013-07-09T14:17:26.430 に答える