Para agentes de IA: um índice de documentação está disponível em https://www.mongodb.com/pt-br/docs/llms.txt — as versões de markdown de todas as páginas estão disponíveis anexando .md a qualquer caminho de URL.
Menu Docs

$redact (estágio de agregaçã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.

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

The $redact stage has the following prototype form:

{ $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 mais informações sobre expressões, consulte Expressões.

Variável do sistema
Descrição

$redact returns the fields at the current document level, excluding embedded documents. To include embedded documents and embedded documents within arrays, apply the $cond expression to the embedded documents to determine access for these embedded documents.

$redact excludes all fields at this current document/embedded document level, without further inspection of any of the excluded fields. This applies even if the excluded field contains embedded documents that may have different access levels.

$redact returns or keeps all fields at this current document/embedded document level, without further inspection of the fields at this level. This applies even if the included field contains embedded documents that may have different access levels.

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:

db.forecasts.insertOne(
{
_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" ]
}
}
]
}
)

A user has access to view information with either the tag "STLW" or "G". To run a query on all documents with year 2014 for this user, include a $redact stage as in the following:

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

Uma collection accounts contém o seguinte documento:

db.accounts.insertOne(
{
_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"
}
}
}
]
);

The $redact stage evaluates the level field to determine access. If the level field equals 5, then exclude all fields at that level, even if the excluded field contains embedded documents that may have different level values, such as the shipping_addr field.

A operação de aggregation retorna o seguinte documento "editado":

{
_id: 1,
level: 1,
acct_id: "xyz123",
status: "A"
}

The result set shows that the $redact stage excluded the field cc as a whole, including the shipping_addr field which contained embedded documents that had level field values equal to 3 and not 5.

Dica

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.

Para saber mais sobre as variáveis do sistema neste guia, consulte a página Variáveis de agregação.

Avalie esta página