Docs Menu
Docs Home
/
MongoDBマニュアル
/ / / /

$where

項目一覧

  • 定義
  • 互換性
  • 構文
  • 動作
  • 利用可能な JavaScript プロパティと関数
  • elemMatch
  • Considerations
  • JavaScript Enablement
  • サポートされていない配列関数と文字列関数
$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> }

注意

$whereは、非推奨のBSON 型JavaScript コード(スコープ付き)のサポートを終了しました(BSON Type 15 )。 $where演算子は、 BSON型のstring ( BSON Type 2)またはBSON型JavaScript ( BSON Type 13)のみをサポートします。 $whereのスコープを持つ BSON 型 JavaScript の使用は、MongoDB 4以降では非推奨となっています。 2 。 1 。

注意

優先される集計の代替手段

$expr 演算子を使用すると、クエリ言語内で集計式を使用できます。$function$accumulator を使用すると、提供されているパイプライン演算子がアプリケーションのニーズを満たせない場合に、ユーザーは JavaScript でカスタム集計式を定義できます。

使用可能な集計演算子を指定すると、次のようになります。

  • JavaScript を使用しない集計演算子とともに$exprを使用することで、 $function以外と$accumulator演算子以外の演算子)は、JavaScript を実行しないため$whereよりも高速であり、可能な場合はこの方法を優先する必要があります。

  • ただし、カスタム式を作成する必要がある場合は、$where よりも$functionが優先されます

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()

$whereクエリ演算子は最上位レベルのドキュメントにのみ適用します。$whereクエリ演算子は、ネストされたドキュメント内、例えば$elemMatch内では機能しません。

  • グローバル変数は使用しないでください。

  • $whereは JavaScript を評価するため、インデックスを利用できません。したがって、標準の MongoDB 演算子(例: $gt$in )を使用してクエリを表現すると、クエリのパフォーマンスが向上します。

  • 一般に、$where は、別の演算子を使用してクエリを表現できない場合にのみ使用してください。$whereを使用する必要がある場合は、結果セットをフィルタリングするために、少なくとも 1 つの他の標準クエリ演算子を含めるようにしてください。$whereのみを使用する場合はコレクションスキャンが必要です。

通常の$where以外のクエリ ステートメントを使用すると、次のパフォーマンス上の利点が得られます。

$where(または$function$accumulatormapReduce)を使用するには、サーバー側スクリプトを有効にする必要があります(デフォルト)。

ただし、これらの操作を使用しない場合は、サーバー側スクリプトを無効にします。

安全な構成オプションを使用して 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" }
])

次の例では、 $wherehex_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"
} } } )

カスタム式を作成する必要がある場合は、$where よりも$functionが優先され

戻る

$regex