sql >> データベース >  >> NoSQL >> MongoDB

サーバー側のjavascript関数にはmongoDBのパフォーマンスの問題がありますか?

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

    eval コマンド

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

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

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

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

    サーバー上のmongoシェルインスタンスを介した.jsファイルの実行

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

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

    $where で検索 -オペレーター

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

    $ whereの使用を避けられない場合は、少なくともfind-queryの通常のツールのいくつかを使用して、$where関数に渡す必要のあるドキュメントのセットを減らすようにしてください。

    MapReduce

    MapReduceは、2つのJavaScript関数を使用して集約データを作成します。以前はMongoDBの主要なデータマイニングツールでしたが、現在では、通常のユースケースのほとんどが、はるかにユーザーフレンドリーな集約フレームワーク

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

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

    tl; dr:

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



    1. Node.jsがMongoDBに接続できない

    2. JunitでRedisをスキップ/モックする

    3. MongoDB 4.0 JRException:「cursor」オプションが必要です。ただし、explain引数を使用した集計は除きます。

    4. MongoDBで特定の配列要素を更新する方法