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 o seguinte formato de protótipo:

{ $redact: <expression> }

O argumento pode ser qualquer expressã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 que o campo incluído contenha 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 visualizar informações com a marcação "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 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