定義
互換性
次の環境でホストされる配置には $where を使用できます。
- MongoDB Atlas はクラウドでの MongoDB 配置のための完全管理サービスです
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
$where演算子の形式は次のとおりです。
{ $where: <string|JavaScript Code> }
注意
$whereでは、非推奨のBSON 型であるスコープ付き JavaScript コード(BSON 型 15)がサポートされなくなりました。$where演算子は、BSON 型 String(BSON 型 2)または BSON 型 JavaScript(BSON 型 13)のみをサポートしています。$whereにおける BSON 型スコープ付き JavaScript の使用は、MongoDB 4.2.1 以降では非推奨となっています。
注意
優先される集計の代替手段
$expr 演算子を使用すると、クエリ言語内で集計式を使用できます。$function と $accumulator を使用すると、提供されているパイプライン演算子がアプリケーションのニーズを満たせない場合に、ユーザーは JavaScript でカスタム集計式を定義できます。
使用可能な集計演算子を指定すると、次のようになります。
$exprJavaScript を使用しない集計演算子($function以外と$accumulator以外の演算子)とともに を使用すると、$whereJavaScriptが実行されないため よりも高速であり、可能な場合はこの方法を優先する必要があります。
動作
利用可能な JavaScript プロパティと関数
map-reduce operationsおよび$where 演算子式は、 db内で使用可能な などの特定のグローバル関数またはプロパティにアクセス できませんmongosh 。
次のJavaScript関数とプロパティは、 map-reduce operationsと$where 演算子式で使用できます。
利用可能なプロパティ | 利用可能な機能 | |
|---|---|---|
|
|
|
elemMatch
$whereクエリ演算子は最上位レベルのドキュメントにのみ適用します。 クエリ演算子は、$where ネストされたドキュメント内、インスタンス$elemMatch クエリ内では機能しません。
Considerations
グローバル変数は使用しないでください。
通常の$where 以外のクエリ ステートメントを使用すると、次のパフォーマンス上の利点が得られます。
MongoDB は、
$whereステートメントの前にクエリの非$whereコンポーネントを評価します。 以外のステートメントで一致するドキュメントがない場合、$whereMongoDB は$whereを使用するクエリ評価を実行しません。
JavaScript Enablement
$where(または$function、$accumulator、またはmapReduce)を使用するには、サーバー側スクリプトを有効にする必要があります(デフォルト)。
ただし、これらの操作を使用しない場合は、サーバー側スクリプトを無効にします。
mongodインスタンスについては、security.javascriptEnabled構成オプションまたは--noscriptingコマンドライン オプションを参照してください。mongosインスタンスについては、security.javascriptEnabled構成オプションまたは--noscriptingコマンドライン オプションを参照してください。
➤ 安全な構成オプションを使用して MongoDB を実行するも参照してください。
サポートされていない配列関数と文字列関数
MongoDB6.0 では、 サーバーサイドJavaScript 、 、$accumulator $function、$where 式に使用される内部JavaScriptエンジンが MozJS-60 から MozJS-91 にアップグレードされています。 MozJS- に存在した非推奨、非標準の配列関数と string60 関数は、MozJS-91 で一部削除されました。
例
playersコレクションに含まれる以下の文書を考えます。
db.players.insertMany([ { _id: 12378, name: "Steve", username: "steveisawesome", first_login: "2017-01-01" }, { _id: 2, name: "Anya", username: "anya", first_login: "2001-02-02" } ])
次の例では、$where とhex_md5() JavaScript関数を使用して、 フィールドの値をname MD5 ハッシュと比較し、一致するドキュメントを返します。
db.players.find( { $where: function() { return (hex_md5(this.name) == "9b53e667f30cd329dca1ec9e6a83e994") } } );
この操作では、次の結果を返します。
{ "_id" : 2, "name" : "Anya", "username" : "anya", "first_login" : "2001-02-02" }
あるいは、前の例は$exprと$functionを使用して書き換えることもできます。 集計演算子$functionを使用して、JavaScript でカスタム集計式を定義できます。 $functionの およびその他の集計演算子にアクセスするには、db.collection.find() $exprとともに使用します。
db.players.find( {$expr: { $function: { body: function(name) { return hex_md5(name) == "9b53e667f30cd329dca1ec9e6a83e994"; }, args: [ "$name" ], lang: "js" } } } )
カスタム式を作成する必要がある場合は、$function よりも$where が優先されます。