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

$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 retorna ou mantém todos os campos no nível de documento atual/ documento incorporado , 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:

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.

To run a query on all documents with status A and exclude all fields contained in a document/embedded document at level 5, include a $redact stage that specifies the system variable "$$PRUNE" in the then field:

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

O conjunto de resultados mostra que o estágio excluiu o $redact campo cc como um todo, incluindo o shipping_addr campo que continha documentos incorporados que tinham level valores de campo iguais a 3 e 5 não.

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.

Os exemplos do Node.js nesta página utilizam o banco de dados do sample_mflix a partir dos conjuntos de dados de amostra do Atlas. Para saber como criar um cluster gratuito do MongoDB Atlas e carregar os conjuntos de dados de exemplo, consulte Introdução na documentação do driver do MongoDB Node.js

Para usar o driver Node.js do MongoDB para adicionar um estágio $redact a um pipeline de agregação , use o operador $redact em um objeto de pipeline.

O exemplo a seguir cria um estágio de pipeline que mantém documentos nos quais o valor do campo imdb.rating é maior ou igual a 9. O estágio exclui todos os outros documentos. Em seguida, o exemplo executa o agregação pipeline:

const pipeline = [
{
$redact: {
$cond: {
if: { $gte: ["$imdb.rating", 9] },
then: "$$KEEP",
else: "$$PRUNE"
}
}
}
];
const cursor = collection.aggregate(pipeline);
return cursor;

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

Avalie esta página