$where (JavaScript 式)
最終更新:2026-10-09
$where (JavaScript 式)
$where は、JavaScript 式をクエリ条件として評価します。`{ $where: 'this.credits == this.debits' }` のように使います。サーバーサイドで実行され、遅く、インデックスも使えません。MongoDB は $expr を推奨しています。$expr で表現できないロジック(独自 JS 関数など)のときだけ使い、インジェクション対策も行いましょう。
| カテゴリ | 要素と評価 |
|---|---|
| MongoDB バージョン | 1.0+ |
| 例の言語 | mongosh(シェル) |
📝 構文
{ $where: <JavaScript expression> }
⚙️ パラメータ
| JS 式 | ブール値を返す JavaScript 式。this は現在のドキュメントを参照します。 |
|---|
戻り値:一致するドキュメントのカーソル
▶ 例
以下のコマンドをローカルの mongosh で実行してください(mongod が起動済みである必要があります):
// $where: credits と debits が等しいレコード(JS)
db.accounts.find({ $where: 'this.credits == this.debits' })
// 推奨: $expr のほうが速い
db.accounts.find({ $expr: { $eq: ['$credits', '$debits'] } })
出力:
// どちらも同じ結果を返すが、$expr のほうがパフォーマンスが良い
📌 注意事項
- サーバーサイド JavaScript を実行する。インデックスは使えず、パフォーマンスが悪い
- $expr(MongoDB 3.6+)を優先する
- インジェクションの危険: ユーザー入力を $where に連結してはいけない
🏷️ 関連タグ
💡 関連ケース
さらなる実践ケースを近日公開予定。
📚 関連チュートリアル
❓ よくある質問
Q$where はなぜ遅いのですか?
Aドキュメントごとにサーバーサイドで JavaScript を評価し、インデックスのサポートもないからです。
Q$where と $expr の選び方は?
A$expr を優先してください。パフォーマンスとインデックスサポートが優れています。$where は独自 JS ロジックにのみ使います。
Q$where にセキュリティ上のリスクはありますか?
Aあります。ユーザー入力を文字列に連結するとインジェクションを招きます。パラメータ化するか、$expr に切り替えてください。