Docs Menu
Docs Home
/
MongoDB 매뉴얼
/ / /

함수 (집계)

이 페이지의 내용

  • 정의
  • 구문
  • 고려 사항
  • 예시
$function

JavaScript에서 사용자 지정 집계 함수 또는 표현식을 정의합니다.

$function 연산자를 사용하여 MongoDB 쿼리 언어에서 지원하지 않는 동작을 구현하는 사용자 지정 함수를 정의할 수 있습니다. $accumulator도 참조하세요.

중요

집계 표현식 내에서 JavaScript를 실행하면 성능이 저하될 수 있습니다. 제공된 파이프라인 연산자로 애플리케이션의 요구 사항을 충족할 수 없는 경우에만 $function 연산자를 사용합니다.

$function 연산자의 구문은 다음과 같습니다.

{
$function: {
body: <code>,
args: <array expression>,
lang: "js"
}
}
필드
유형
설명

문자열 또는 코드

함수 정의. 함수 정의를 BSON type 코드 또는 문자열로 지정할 수 있습니다.lang도 함께 참조하세요.

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

or

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

배열

함수 본문에 전달된 인수입니다. body 함수가 인수를 받지 않는 경우 빈 배열 [ ] 를 지정할 수 있습니다.

배열 요소는 코드를 포함한 모든 BSON 일 수 있습니다. 2예시:$where 의 대안을 참조하세요.

문자열

본문에 사용되는 언어 입니다.lang: "js" 을(를) 지정해야 합니다.

$function을 스키마 유효성 검사 쿼리 표현식의 일부로 사용할 수 없습니다.

$function을 사용하려면 서버 측 스크립팅이 활성화되어 있어야 합니다(기본값).

$function (또는 $accumulator, $where 또는 mapReduce)을 사용하지 않는 경우 서버 측 스크립팅을 비활성화합니다.

또한 ➤ 보안 구성 옵션으로 MongoDB 실행을 참조하세요.

쿼리 연산자 $where을(를) 사용하여 JavaScript 표현식을 지정할 수도 있습니다. 그러나

  • $expr 연산자를 사용하면 쿼리 언어 내에서 집계 표현식을 사용할 수 있습니다.

  • 제공된 파이프라인 연산자가 애플리케이션의 요구 사항을 충족할 수 없는 경우 $function$accumulator를 통해 JavaScript에서 사용자 지정 집계 표현식을 정의할 수 있습니다.

사용 가능한 집계 연산자가 주어집니다.

  • JavaScript를 사용하지 않는 집계 연산자와 함께 $expr를 사용하는 경우(예:비-$function 및 비-$accumulator 연산자)는 JavaScript를 실행하지 않기 때문에 $where보다 빠르며 가능하면 선호되어야 합니다.

  • 그러나 사용자 지정 표현식을 작성해야 하는 경우에는 $where보다 $function을 사용하는 것이 좋습니다.

MongoDB 6.0에서는 서버 측 JavaScript, $accumulator, $function, $where 표현식에 사용되는 내부 JavaScript 엔진이 MozJS-60 에서 MozJS-91로 업그레이드됩니다. MozJS-91에서는 MozJS-60에 존재했던 사용 중단된 비표준 배열과 문자열 함수가 제거되었습니다.

제거된 배열 및 문자열 함수의 전체 목록은 6.0 호환성 정보를 참조하십시오.

다음 문서를 사용하여 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 이 값의 값은 이름의 MD5 해시가 지정된 해시와 같은지 확인하는 사용자 지정 $function 표현식에 의해 결정됩니다.

  • message 의 값은 템플릿을 사용하여 문자열 메시지 형식을 지정하는 사용자 지정 $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를 사용하지 않는 집계 연산자와 함께 $expr를 사용하는 경우(예:비-$function 및 비-$accumulator 연산자)는 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

이 페이지의 내용