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

$redact (집계)

이 페이지의 내용

  • 정의
  • 예시
$redact

문서 자체에 저장된 정보를 기반으로 전체 문서 또는 문서 내 컨텐츠가 출력되지 않도록 제한합니다.

미들웨어와 편집이 탑재된 보안 아키텍처 다이어그램.

$redact 단계에는 다음과 같은 프로토타입 형식이 있습니다.

{ $redact: <expression> }

인수는 $$DESCEND, $$PRUNE 또는 $$KEEP 시스템 변수로 확인되는 한 어떠한 유효한 표현식이든 될 수 있습니다. 표현식에 대한 자세한 내용은 표현식 연산자를 참조하세요.

시스템 변수
설명
$$DESCEND
$redact는 내장된 문서를 제외하고 현재 문서 수준의 필드를 반환합니다. 내장된 문서와 내장된 배열 내 내장된 문서를 포함시키려면 내장된 문서에 $cond 표현식을 적용하여 이러한 내장된 문서에 대한 액세스를 결정하세요.
$$PRUNE
$redact는 제외된 필드에 대한 추가 검사 없이 현재 문서 및 내장된 문서 수준에서 모든 필드를 제외합니다. 이는 제외된 필드에 액세스 수준이 다를 수 있는 내장된 문서가 있는 경우에도 적용됩니다.
$$KEEP
$redact는 이 수준의 필드에 대한 추가 검사 없이 현재 문서 및 내장된 문서 수준에서 모든 필드를 반환하거나 유지합니다. 이는 포함된 필드에 액세스 수준이 다를 수 있는 내장된 문서가 있는 경우에도 적용됩니다.

이 섹션의 예시에서는 db.collection.aggregate() 헬퍼를 사용합니다.

forecasts collection에는 다음 형식의 문서가 포함되어 있습니다. 여기서 tags 필드는 해당 문서/내장된 문서 수준에 대한 다양한 액세스 값을 나열합니다. 즉, [ "G", "STLW" ] 값은 "G" 또는 "STLW"이(가) 데이터에 액세스할 수 있음을 지정합니다.

{
_id: 1,
title: "123 Department Report",
tags: [ "G", "STLW" ],
year: 2014,
subsections: [
{
subtitle: "Section 1: Overview",
tags: [ "SI", "G" ],
content: "Section 1: This is the content of section 1."
},
{
subtitle: "Section 2: Analysis",
tags: [ "STLW" ],
content: "Section 2: This is the content of section 2."
},
{
subtitle: "Section 3: Budgeting",
tags: [ "TK" ],
content: {
text: "Section 3: This is the content of section 3.",
tags: [ "HCS" ]
}
}
]
}

사용자가 "STLW" 또는 "G" 태그를 지정하여 정보를 보기 위해 액세스했습니다. 이 사용자에 대해 2014년을 포함하는 모든 문서에 대한 쿼리를 실행하려면 다음과 같이 $redact 단계를 포함합니다.

var userAccess = [ "STLW", "G" ];
db.forecasts.aggregate(
[
{ $match: { year: 2014 } },
{ $redact: {
$cond: {
if: { $gt: [ { $size: { $setIntersection: [ "$tags", userAccess ] } }, 0 ] },
then: "$$DESCEND",
else: "$$PRUNE"
}
}
}
]
);

집계 작업은 다음과 같은 '수정된' 문서를 반환합니다.

{
"_id" : 1,
"title" : "123 Department Report",
"tags" : [ "G", "STLW" ],
"year" : 2014,
"subsections" : [
{
"subtitle" : "Section 1: Overview",
"tags" : [ "SI", "G" ],
"content" : "Section 1: This is the content of section 1."
},
{
"subtitle" : "Section 2: Analysis",
"tags" : [ "STLW" ],
"content" : "Section 2: This is the content of section 2."
}
]
}

다음도 참조하세요.

  • $size

  • $setIntersection

컬렉션 accounts에는 다음 문서가 포함되어 있습니다.

{
_id: 1,
level: 1,
acct_id: "xyz123",
cc: {
level: 5,
type: "yy",
num: 000000000000,
exp_date: ISODate("2015-11-01T00:00:00.000Z"),
billing_addr: {
level: 5,
addr1: "123 ABC Street",
city: "Some City"
},
shipping_addr: [
{
level: 3,
addr1: "987 XYZ Ave",
city: "Some City"
},
{
level: 3,
addr1: "PO Box 0123",
city: "Some City"
}
]
},
status: "A"
}

이 예시 문서에서 level 필드는 데이터를 보는 데 필요한 액세스 수준을 결정합니다.

상태가 A인 모든 문서에 대해 쿼리를 실행하고 5 수준의 문서/내장된 문서에 있는 모든 필드를 제외하려면 then 필드에 시스템 변수 "$$PRUNE"을 지정하는 $redact 단계를 포함합니다.

db.accounts.aggregate(
[
{ $match: { status: "A" } },
{
$redact: {
$cond: {
if: { $eq: [ "$level", 5 ] },
then: "$$PRUNE",
else: "$$DESCEND"
}
}
}
]
);

$redact 단계에서는 level 필드를 평가하여 액세스 권한을 결정합니다. level 필드가 5이면 제외된 필드에 level 값이 다를 수 있는 내장된 문서(예: shipping_addr 필드)가 있더라도 해당 수준의 모든 필드를 제외합니다.

집계 작업은 다음과 같은 '수정된' 문서를 반환합니다.

{
"_id" : 1,
"level" : 1,
"acct_id" : "xyz123",
"status" : "A"
}

결과 집합은 $redact 단계에서 3 과 동일하며 5가 아닌 level 필드 값을 가진 내장된 문서가 포함된 shipping_addr 필드를 비롯하여 필드 cc가 전체적으로 제외되었음을 보여줍니다.

다음도 참조하세요.

필드 수준 편집을 구현하여 동일한 데이터에 대한 여러 가지 액세스 조합을 설정하는 단계를 수행합니다.

돌아가기

로그 출력 토글

이 페이지의 내용