$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 se resolva para as variáveis de sistema
$$DESCEND
,$$PRUNE
ou$$KEEP
. Para mais informações sobre expressões, consulte Expressões.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 se campo incluído contiver 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.