ここでできることがいくつかあります:
まず、$またはの代わりに$inを使用します。
次に、MongoDBはのみ 最初の一致にはインデックスを使用するため、2つの一致のどちらが優れているかを(試して)判断する必要があります。目標は、クエリを高速化し、パイプラインを通過するドキュメントを少なくすることです。そのためには、次のことを行います。
まず、3つのインデックスを作成します。
db.element.ensureIndex( { 'versions.branch' : 1 } );
db.element.ensureIndex( { 'doctype' : 1 } );
db.element.ensureIndex( { 'prefix' : 1 } );
次に、次の3つのクエリを実行して、「cursor」、「n」、「nScanned」、および「ms」フィールドに注目してください。
branch = "nameofbranch"; // guessing here
db.element.find( "versions.branch": branch ).explain();
db.element.find( "doctype" { $in: [ "15281", "15282" .... ] } ).explain();
db.element.find( "prefix": { $ne: "500" } ).explain();
最後のクエリでは、$ neクエリはインデックスを使用できないため、「cursor」は「BasicCursor」であることに注意してください。
他の2つには、「ms」、「n」、「nScanned」のさまざまな値が表示されます。 「ms」は、クエリの実行にかかった時間です。これがほぼ同じである場合は、「n」と「nScanned」の値の違いを確認してください。 「versions.branch」クエリの違いは0であると予想し、推測します。「doctype」クエリの場合は異なる可能性があります。「ms」がほぼ同じでない場合は、最速の$matchを入力します。最初は集約パイプラインの$match句として。
速度( "ms")が両方とも同じである場合は、"n"の値を確認してください。 「prefix」クエリの「n」が「5」で、「versions.branch」クエリの「n」が「500」の場合、「prefix」クエリの結果はより少なく、より良いことを意味します。ドキュメントが返されます。その場合は、それを最初の$match句としてまとめて配置します。 「versions.branch」がはるかに少ない場合は、それを最初の$match句として使用します。