정의
$function중요
서버 측 JavaScript는 더 이상 사용되지 않습니다
MongoDB 부터 서버 8.0 측 JavaScript
$accumulator$function함수(,,$where)는 더 이상 사용되지 않습니다. MongoDB 이러한 함수를 실행 때 경고를 기록합니다.JavaScript에서 사용자 지정 집계 함수 또는 표현식을 정의합니다.
연산자 사용하여 MongoDB 쿼리 언어에서 지원하지 않는 동작을
$function$accumulator구현 사용자 지정 함수를 정의할 수 있습니다. 도 참조하세요.중요
집계 표현식 내에서 JavaScript 실행하면 성능이 저하될 수 있습니다. 제공된
$function파이프라인 연산자가 애플리케이션의 요구 사항을 충족할 수 없는 경우에만 연산자 사용합니다.
구문
$function 연산자 구문은 다음과 같습니다.
{ $function: { body: <code>, args: <array expression>, lang: "js" } }
필드 | 유형 | 설명 |
|---|---|---|
문자열 또는 코드 | 함수 정의입니다. 함수 정의를 BSON 유형 코드나 문자열로 지정할 수 있습니다. lang도 함께 참조하세요.
or
| |
배열 | 함수 본문에 전달된 인수입니다. body 함수가 인수를 받지 않는 경우 빈 배열 배열 요소는 코드를 포함한 모든 BSON types일 수 있습니다. 2예시: | |
문자열 | 본문에서 사용되는 언어. 반드시 를 지정해야 |
고려 사항
스키마 유효성 검사 제한
Javascript Enablement
를 사용하려면 서버 측 스크립팅을 활성화해야 합니다(기본값).$function
(또는, 또는)를 $function $accumulator$where mapReduce사용하지 않는 경우 서버 측 스크립팅을 비활성화합니다.
mongod인스턴스의 경우security.javascriptEnabled구성 옵션 또는 명령줄 옵션을 참조하세요--noscripting.mongos인스턴스의 경우security.javascriptEnabled구성 옵션 또는--noscripting명령줄 옵션을 참조하세요.이전 버전에서 MongoDB는
mongos인스턴스에서 JavaScript 실행을 허용하지 않습니다.
또한 ➤ 보안 구성 옵션으로 MongoDB 실행을 참조하세요.
의 대안 $where
쿼리 연산자 $where을(를) 사용하여 JavaScript 표현식을 지정할 수도 있습니다. 그러나
및 를 사용하면 제공된 파이프라인 연산자가 애플리케이션의 요구 사항을 충족할 수 없는 경우 사용자가 JavaScript 에서 사용자 지정 집계 표현식을 정의할 수
$function$accumulator있습니다.
사용 가능한 집계 연산자가 주어집니다.
그러나 사용자 지정 표현식을 만들어야 하는 경우
$function보다 를 사용하는$where것이 좋습니다.
지원되지 않는 배열 및 문자열 함수
MongoDB 6.0 은 서버 측 JavaScript ,, $accumulator $function및 표현식에 사용되는 $where 내부 JavaScript 엔진 MozJS- 에서60 MozJS-91 로 업그레이드합니다. MozJS- 에 존재했던 사용 중단된 몇 가지 비표준 배열 및 문자열 함수가60 MozJS-91 에서 제거되었습니다.
예시
예시 1: 사용 예시
다음 문서를 사용하여 players라는 이름의 샘플 collection을 생성합니다.
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 해시가 지정된 해시와 같은지 확인하는 사용자 지정 표현식 에 의해 값이 결정됩니다.$function5message템플릿을 사용하여 문자열$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." }
팁
MongoDB 8.3부터는 $hexHash 를 hex_md5의 네이티브 집계 대안으로 사용할 수 있습니다. $hexHash 는 서버 측 JavaScript 필요하지 않으며 MD5 외에도 SHA-256 및 XXH64 알고리즘을 지원합니다. 참고로 $hexHash 은 대문자 16진수 문자열을 반환하고 hex_md5 은 소문자를 반환합니다. MD5 는 레거시 알고리즘 이며 FIPS 모드 에서는 비활성화됩니다.
예시 2, 다음과 같은 대안이 있습니다. $where
참고
$where보다 권장되는 집계 대안
연산자 사용하면 쿼리 언어 내에서 집계 표현식을 사용할 수 $expr 있습니다. 또한 및 $function 를 사용하면 $accumulator 제공된 파이프라인 연산자가 애플리케이션의 요구 사항을 충족할 수 없는 경우 사용자가 JavaScript 에서 사용자 지정 집계 표현식을 정의할 수 있습니다.
사용 가능한 집계 연산자가 주어집니다.
그러나 사용자 지정 표현식을 만들어야 하는 경우
$function보다 를 사용하는$where것이 좋습니다.
$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" } } } )