ここには2つのオプションがあります。 1つ目は、 $where
を使用することです。
オペレーター。
Collection.find( { $where: "this.start === this.end" } )
2番目のオプションは、集約フレームワークと$redact
オペレーター。
Collection.aggregate([
{ "$redact": {
"$cond": [
{ "$eq": [ "$start", "$end" ] },
"$$KEEP",
"$$PRUNE"
]
}}
])
$where
演算子はJavaScript評価を行い、インデックスを利用できないため、$where
を使用してクエリを実行します アプリケーションのパフォーマンスが低下する可能性があります。 考慮事項
を参照してください。 。 $ whereを使用すると、$ where操作の前に各ドキュメントがBSONからJavaScriptオブジェクトに変換され、パフォーマンスが低下します。もちろん、インデックスフィルタがあれば、クエリを改善できます。また、ユーザー入力に基づいて動的にクエリを作成する場合は、セキュリティ上のリスクがあります。
$redact
$where
のように インデックスを使用せず、コレクションスキャンも実行しませんが、$redact
を実行すると、クエリのパフォーマンスが向上します。 これは標準のMongoDBオペレーターだからです。とはいえ、$ match演算子を使用してドキュメントをいつでもフィルタリングできるため、集計オプションの方がはるかに優れています。
$where
ここは問題ありませんが、回避できます。また、必要なのは$where
だけだと思います スキーマ設計の問題がある場合。たとえば、ここでは、インデックスを使用してドキュメントに別のブールフィールドを追加することをお勧めします。