Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/ / /

$redact (agregação)

Nesta página

  • Definição
  • Exemplos
$redact

Restringe a saída de documentos inteiros ou conteúdo dentro de documentos com base nas informações armazenadas nos próprios documentos.

Diagrama da arquitetura de segurança com middleware e redação.

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 obter mais informações sobre expressões, consulte Operadores de expressão.

Variável do sistema
Descrição
$$DESCEND
$redact retorna os campos no nível do documento atual, excluindo os documentos incorporados. Para incluir documentos incorporados e documentos incorporados em arrays, aplique a expressão $cond aos documentos incorporados para determinar o acesso a eles.
$$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.

Os exemplos nessa seção usam o auxiliar db.collection.aggregate().

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."
}
]
}

Dica

Veja também:

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.

← $project (agregação)

Nesta página