JavaScript (サーバーサイドコード)
最終更新:2026-10-09
JavaScript (サーバーサイドコード)
JavaScript 型はドキュメント内に JS コードを格納し、`$where` を通じてサーバー側で実行されます(ドキュメントごとに実行)。`$where` はインデックスを使えず遅く、小さなコレクションか、クエリ演算子では表現できないロジックにのみ適しています。MongoDB 8.0 以降、サーバーサイド JavaScript はデフォルトで無効で、明示的な起動フラグが必要です。新しいコードでは `$expr` または `$function` アグリゲーション演算子を推奨します。
| カテゴリ | BSON 型 |
|---|---|
| MongoDB バージョン | 1.0+ |
| 例の言語 | mongosh(シェル) |
📝 構文
{ $where: "this.price * this.qty > 100" }
{ $expr: { $gt: [{ $multiply: ["$price", "$qty"] }, 100] } }
戻り値:$where は述語を満たすドキュメントを返します。保存される JS 値はコード文字列です
▶ 例
以下のコマンドをローカルの mongosh で実行してください(mongod が起動済みである必要があります):
// JavaScript: サーバーサイドの $where
use shop
db.orders.find({ $where: 'this.price * this.qty > 1000' })
出力:
// price * qty > 1000 の注文(コレクションスキャン)
📌 注意事項
- $where はドキュメントごとに JS を実行し、インデックスを使えず遅い
- サーバーサイド JS は8.0以降デフォルトでオフ(--enableJavaScriptExecution で有効化)
- より安全で高速な同等機能には $expr/$function を推奨
🏷️ 関連タグ
💡 関連ケース
さらなる実践ケースを近日公開予定。
📚 関連チュートリアル
❓ よくある質問
Qなぜ $where は遅いのですか?
Aドキュメントごとに JS インタープリタを呼び出し、インデックスを使えず、全体スキャンを強制するためです。
Q$where は MongoDB 8.0 でも動きますか?
Aデフォルトで無効です。--enableJavaScriptExecution でサーバーを起動すると再び有効になります。
Q複雑な複数フィールド間の比較はどう表現しますか?
A$expr と $multiply などのアグリゲーション演算子を組み合わせます。最適化が効き、部分的にインデックスも利用できます。