$where
を使用する
演算子は、他の条件でインデックス選択を使用する可能性があるかどうかに関係なく、両方とも完全なコレクションスキャンを呼び出すため、ほとんどの場合回避する必要があります。
さらに、各結果ドキュメントに対してJavaScriptインタープリターを呼び出します。これは、ネイティブコードよりもかなり遅くなります。マニュアルページの警告を読んでください。理由があります
可能な場合は、.aggregate()
代わりに、このタイプの比較のために。あなたの場合、それは間違いなくより良いオプションです:
db.foo.aggregate([
{ "$match": { "flag": true } },
{ "$unwind": "$versions" },
{ "$project": {
"versions": "$versions"
"same": { "$eq": [ "$versions.version", "$defaultVersion" ] }
}}
{ "$match": { "same": true } },
{ "$project": {
"_id": 0,
"versions": 1
}}
])
これにより、最初に「フラグ」条件でクエリをフィルタリングし、次に配列の各メンバーを調べて、2つのフィールドが同じであるかどうかを比較できます。
必要に応じて、一致した配列要素を、複数の一致がある配列にロールバックできます。しかし、それはあなたの要件ではないと思います。