$redact (agregação)
Definição
$redact
Restringe a saída de documentos inteiros ou conteúdo dentro de documentos com base nas informações armazenadas nos próprios documentos.
O estágio
$redact
tem a seguinte forma de protótipo:{ $redact: <expression> } O argumento pode ser qualquerexpressão válida, desde que seja resolvida para as variáveis de sistema
$$DESCEND
,$$PRUNE
ou$$KEEP
. Para mais informações sobre expressões, consulte Operadores de Expressão.Variável do sistemaDescrição- $$DESCEND
- $$PRUNE
$redact
exclui todos os campos no nível do documento/ documento incorporado atual, sem inspeção adicional de qualquer um dos campos excluídos. Isso se aplica mesmo que o campo excluído contenha documentos incorporados que possam ter diferentes níveis de acesso.- $$KEEP
$redact
retorna ou mantém todos os campos no nível de documento/ documento incorporado atual, sem inspeção adicional dos campos desse nível. Isso se aplica mesmo que o campo incluído contenha documentos incorporados que possam ter diferentes níveis de acesso.
Exemplos
Os exemplos nessa seção usam o auxiliar db.collection.aggregate()
.
Avalie o acesso em todos os níveis de documento
Uma collection forecasts
contém documentos do seguinte formulário onde o campo tags
lista os diferentes valores de acesso desse nível de documento/documento incorporado; ou seja, um valor de [ "G", "STLW" ]
especifica que "G"
ou "STLW"
podem acessar os dados:
{ _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" ] } } ] }
Um usuário tem acesso para ver informações com a tag "STLW"
ou "G"
. Para executar uma query em todos os documentos com o ano 2014
para esse usuário, inclua um estágio $redact
como a seguir:
var userAccess = [ "STLW", "G" ]; db.forecasts.aggregate( [ { $match: { year: 2014 } }, { $redact: { $cond: { if: { $gt: [ { $size: { $setIntersection: [ "$tags", userAccess ] } }, 0 ] }, then: "$$DESCEND", else: "$$PRUNE" } } } ] );
A operação de aggregation retorna o seguinte documento "editado":
{ "_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." } ] }
Excluir todos os campos de um determinado nível
Uma collection accounts
contém o seguinte documento:
{ _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" }
Nesse documento de exemplo, o campo level
determina o nível de acesso necessário para visualizar os dados.
Para executar uma query em todos os documentos com status A
e excluir todos os campos contidos em um documento/documento incorporado no nível 5
, inclua uma etapa $redact
que especifique a variável do sistema "$$PRUNE"
no campo then
:
db.accounts.aggregate( [ { $match: { status: "A" } }, { $redact: { $cond: { if: { $eq: [ "$level", 5 ] }, then: "$$PRUNE", else: "$$DESCEND" } } } ] );
O estágio $redact
avalia o campo level
para determinar o acesso. Se o campo level
for igual a 5
, exclua todos os campos desse nível, mesmo que o campo excluído contenha documentos incorporados que possam ter valores de level
diferentes, como o campo shipping_addr
.
A operação de aggregation retorna o seguinte documento "editado":
{ "_id" : 1, "level" : 1, "acct_id" : "xyz123", "status" : "A" }
O conjunto de resultados mostra que o estágio $redact
excluiu o campo cc
como um todo, incluindo o campo shipping_addr
que continha documentos incorporados que tinham level
valores de campo iguais a 3
e não 5
.
Dica
Veja também:
Implemente a edição no nível do campo para etapas de configuração de múltiplas combinações de acesso para os mesmos dados.