定義
互換性
次の環境でホストされる配置には $where を使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
$where 演算子は次の形式をとります。
{ $where: <string|JavaScript Code> }
注意
注意
優先される集計の代替手段
$expr 演算子を使用すると、クエリ言語内で集計式を使用できます。$function と $accumulator を使用すると、提供されているパイプライン演算子がアプリケーションのニーズを満たせない場合に、ユーザーは JavaScript でカスタム集計式を定義できます。
使用可能な集計演算子を指定すると、次のようになります。
JavaScript を使用しない集計演算子とともに
$exprを使用することで、$function以外と$accumulator演算子以外の演算子)は、JavaScript を実行しないため$whereよりも高速であり、可能な場合はこの方法を優先する必要があります。ただし、カスタム式を作成する必要がある場合は、
$whereよりも$functionが優先されます。
動作
利用可能な JavaScript プロパティと関数
map-reduce operationsおよび$where 演算子式は、 dbで使用可能な などの特定のグローバル関数またはプロパティにアクセス できませんmongosh 。
次の JavaScript 関数とプロパティは、 map-reduce operationsと$where演算子式で使用できます。
利用可能なプロパティ | 利用可能な機能 | |
|---|---|---|
argsMaxKeyMinKey | assert()BinData()DBPointer()DBRef()doassert()emit()gc()HexData()hex_md5()isNumber()isObject()ISODate()isString() | Map()MD5()NumberInt()NumberLong()ObjectId()print()printjson()printjsononeline()sleep()Timestamp()tojson()tojsononeline()tojsonObject()UUID()version() |
elemMatch
$whereクエリ演算子は最上位レベルのドキュメントにのみ適用します。$whereクエリ演算子は、ネストされたドキュメント内、例えば$elemMatch内では機能しません。
Considerations
グローバル変数は使用しないでください。
$whereは JavaScript を評価するため、インデックスを利用できません。したがって、標準の MongoDB 演算子(例:$gt、$in)を使用してクエリを表現すると、クエリのパフォーマンスが向上します。一般に、
$whereは、別の演算子を使用してクエリを表現できない場合にのみ使用してください。$whereを使用する必要がある場合は、結果セットをフィルタリングするために、少なくとも 1 つの他の標準クエリ演算子を含めるようにしてください。$whereのみを使用する場合はコレクションスキャンが必要です。
通常の$where以外のクエリ ステートメントを使用すると、次のパフォーマンス上の利点が得られます。
MongoDB は、
$whereステートメントの前にクエリの$whereのコンポーネントを評価します。以外の$whereステートメントが一致するドキュメントがない場合、MongoDB は$whereを使用するクエリ評価を実行しません。$where以外のクエリ ステートメントではインデックスを使用できます。
JavaScript Enablement
$where(または$function 、 $accumulator 、 mapReduce)を使用するには、サーバー側スクリプトを有効にする必要があります(デフォルト)。
ただし、これらの操作を使用しない場合は、サーバー側スクリプトを無効にします。
mongodインスタンスについては、security.javascriptEnabled構成オプションまたは--noscriptingコマンドライン オプションを参照してください。mongosインスタンスについては、security.javascriptEnabled構成オプションまたは--noscriptingコマンドライン オプションを参照してください。
➤ 安全な構成オプションを使用して MongoDB を実行するも参照してください。
例
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フィールドの値を MD 5 ハッシュと比較し、一致するドキュメントを返します。
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" } } } )