$redact (집계)
정의
$redact
문서 자체에 저장된 정보를 기반으로 전체 문서 또는 문서 내 컨텐츠가 출력되지 않도록 제한합니다.
$redact
단계의 프로토타입 형식은 다음과 같습니다.{ $redact: <expression> } 인수는
$$DESCEND
,$$PRUNE
또는$$KEEP
시스템 변수로 해석되는 한 유효한 표현식 이 될 수 있습니다. 표현식에 대한 자세한 내용은 표현식을 참조하세요 .시스템 변수설명- $$DESCEND
- $$PRUNE
- $$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." } ] }
특정 수준에서 모든 필드 제외
컬렉션 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
가 전체적으로 제외되었음을 보여줍니다.