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

$function(集計)

項目一覧

  • 定義
  • 構文
  • Considerations
$function

JavaScript でカスタム集計関数または式を定義します。

$function 演算子を使用して、MongoDB クエリ言語ではサポートされていない動作を実装するカスタム関数を定義できます。 $accumulatorも参照してください。

重要

集計式の内部で JavaScript を実行すると、パフォーマンスが低下する可能性があります。提供されたパイプライン演算子がアプリケーションのニーズを満たせない場合にのみ、$function 演算子を使用してください。

$function演算子の構文は次のとおりです。

{
$function: {
body: <code>,
args: <array expression>,
lang: "js"
}
}
フィールド
タイプ
説明
文字列またはコード

関数の定義。 You can specify the function definition as either BSON type Code or String. lang も参照してください。

function(arg1, arg2, ...) { ... }

or

"function(arg1, arg2, ...) { ... }"

配列

関数 body に渡される引数。body 関数が引数を取らない場合は、空の配列[ ]を指定できます。

配列要素は、コードを含む任意の BSON タイプにすることができます。 例2を参照してください: $whereの代替手段

文字列

body 内で使用される言語。lang: "js"を指定する必要があります。

$functionをスキーマ検証クエリ式の一部として使用することはできません。

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

$function(または $accumulator$wheremapReduce)を使用しない場合は、サーバー側スクリプトを無効にします。

  • mongodインスタンスについては、 security.javascriptEnabled構成オプションまたは--noscriptingコマンドライン オプションを参照してください。

  • mongosインスタンスについては、 security.javascriptEnabled構成オプションまたは--noscriptingコマンドライン オプションを参照してください。

    In earlier versions, MongoDB does not allow JavaScript execution on mongos instances.

安全な構成オプションを使用して MongoDB を実行するも参照してください。

クエリ演算子 $where を使用して JavaScript 式を指定することもできます。ただし、

  • $expr 演算子を使用すると、クエリ言語内で 集計式 を使用できます。

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

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

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

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

MongoDB 6.0では、サーバーサイド JavaScript$accumulator$function$where式に使用される内部 JavaScript エンジンが MozJS- 60から MozJS- 91にアップグレードされています。 MozJS- 60に存在した非推奨、非標準の配列関数と string 関数は、MozJS- 91で一部削除されました。

削除された配列関数と文字列関数の完全なリストについては、6.0 互換性ノートを参照してください

下記のドキュメントを含む、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." }

注意

$where よりも優先される集計の代替手段

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

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

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

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

$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"
} } } )

戻る

$floor