$function(集計)
定義
$function
JavaScript でカスタム集計関数または式を定義します。
$function
演算子を使用して、MongoDB クエリ言語ではサポートされていない動作を実装するカスタム関数を定義できます。$accumulator
も参照してください。
構文
$function
演算子の構文は次のとおりです。
{ $function: { body: <code>, args: <array expression>, lang: "js" } }
フィールド | タイプ | 説明 |
---|---|---|
文字列またはコード | 関数の定義。 You can specify the function definition as either BSON type Code or String. lang も参照してください。
or
| |
配列 | 関数 body に渡される引数。body 関数が引数を取らない場合は、空の配列 配列要素は、コードを含む任意の BSON タイプにすることができます。 例2を参照してください: | |
文字列 | body 内で使用される言語。 |
Considerations
スキーマ検証の制限
$function
スキーマ検証 クエリ述語の一部として を使用することはできません。
Javascript Enablement
$function
を使用するには、サーバー側スクリプトを有効にする必要があります(デフォルト)。
$function
(または $accumulator
、$where
、mapReduce
)を使用しない場合は、サーバー側スクリプトを無効にします。
mongod
インスタンスについては、security.javascriptEnabled
構成オプションまたは--noscripting
コマンドライン オプションを参照してください。mongos
インスタンスについては、security.javascriptEnabled
構成オプションまたは--noscripting
コマンドライン オプションを参照してください。In earlier versions, MongoDB does not allow JavaScript execution onmongos
instances.
➤ 安全な構成オプションを使用して MongoDB を実行するも参照してください。
代替 $where
クエリ演算子 $where
を使用して JavaScript 式を指定することもできます。ただし、
$function
と$accumulator
を使用すると、提供されているパイプライン演算子がアプリケーションのニーズを満たせない場合に、ユーザーは JavaScript でカスタム集計式を定義できます。
使用可能な集計演算子を指定すると、次のようになります。
サポートされていない配列関数と文字列関数
MongoDB 6.0では、サーバーサイド JavaScript 、 $accumulator
、 $function
、 $where
式に使用される内部 JavaScript エンジンが MozJS- 60から MozJS- 91にアップグレードされています。 MozJS- 60に存在した非推奨、非標準の配列関数と string 関数は、MozJS- 91で一部削除されました。
削除された配列関数と文字列関数の完全なリストについては、6.0 互換性ノートを参照してください。
例
例1:使用例
下記のドキュメントを含む、players
という名前のサンプル コレクションを作成します。
db.players.insertMany([ { _id: 1, name: "Miss Cheevous", scores: [ 10, 5, 10 ] }, { _id: 2, name: "Miss Ann Thrope", scores: [ 10, 10, 10 ] }, { _id: 3, name: "Mrs. Eppie Delta ", scores: [ 9, 8, 8 ] } ])
下記の集計操作では、 $addFields
を使用して各ドキュメントに新しいフィールドを追加します。
isFound
この値は、名前の MD 5ハッシュが指定されたハッシュと等しいかどうかを確認するカスタム$function
式によって決定されます。message
その値は、テンプレートを使用して string メッセージを形式するカスタム$function
式によって決定されます。
db.players.aggregate( [ { $addFields: { isFound: { $function: { body: function(name) { return hex_md5(name) == "15b0a220baa16331e8d80e15367677ad" }, args: [ "$name" ], lang: "js" } }, message: { $function: { body: function(name, scores) { let total = Array.sum(scores); return `Hello ${name}. Your total score is ${total}.` }, args: [ "$name", "$scores"], lang: "js" } } } } ] )
この操作により、次のドキュメントが返されます。
{ "_id" : 1, "name" : "Miss Cheevous", "scores" : [ 10, 5, 10 ], "isFound" : false, "message" : "Hello Miss Cheevous. Your total score is 25." } { "_id" : 2, "name" : "Miss Ann Thrope", "scores" : [ 10, 10, 10 ], "isFound" : true, "message" : "Hello Miss Ann Thrope. Your total score is 30." } { "_id" : 3, "name" : "Mrs. Eppie Delta ", "scores" : [ 9, 8, 8 ], "isFound" : false, "message" : "Hello Mrs. Eppie Delta . Your total score is 25." }
例2:代替案 $where
注意
$where よりも優先される集計の代替手段
$expr
演算子を使用すると、問い合わせ言語内で集計式を使用できます。 また、 $function
と$accumulator
を使用すると、提供されている パイプライン演算子が アプリケーションのニーズを満たせない場合に、ユーザーは JavaScript でカスタム集計式を定義できます。
使用可能な集計演算子を指定すると、次のようになります。
$where
演算子を使用するクエリの代わりに、 $expr
と$function
を使用できます。 たとえば、次の$where
の例について考えてみましょう。
db.players.find( { $where: function() { return (hex_md5(this.name) == "15b0a220baa16331e8d80e15367677ad") } } );
db.collection.find()
操作は次のドキュメントを返します。
{ "_id" : 2, "name" : "Miss Ann Thrope", "scores" : [ 10, 10, 10 ] }
この例えは$expr
と$function
を使用して表現できます。
db.players.find( {$expr: { $function: { body: function(name) { return hex_md5(name) == "15b0a220baa16331e8d80e15367677ad"; }, args: [ "$name" ], lang: "js" } } } )