$where
項目一覧
定義
$where
重要
サーバーサイド JavaScript の非推奨化
MongoDB 8.0 以降、サーバーサイド JavaScript 関数(
$accumulator
、$function
、$where
)は非推奨です。MongoDB では、これらの関数を実行すると警告がログに記録されます。$where
演算子を使用して、JavaScript 式を含む文字列または完全な JavaScript 関数のいずれかをクエリシステムに渡します。$where
は柔軟性を高めますが、データベースがコレクション内の各ドキュメントの JavaScript 式または関数を処理する必要があります。this
またはobj
を使用して、JavaScript 式または関数でドキュメントを参照します。
互換性
次の環境でホストされる配置には $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
演算子式で使用できます。
利用可能なプロパティ | 利用可能な機能 | |
---|---|---|
args MaxKey MinKey | 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 を実行するも参照してください。
サポートされていない配列関数と文字列関数
MongoDB 6.0 では、サーバー側 JavaScript 、 $accumulator
、 $function
、 $where
式に使用される内部 JavaScript エンジンを MozJS- 60 から MozJS-91 にアップグレードします。MozJS-60 に存在した非推奨、非標準の配列関数と文字列関数は、MozJS-91 で一部削除されました。
削除された配列関数と文字列関数の完全なリストについては、6.0 互換性ノートを参照してください。
例
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" } } } )