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