Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
Docs Menu

$redact (etapa de agregación)

$redact

Restringe que los documentos completos o el contenido dentro de los documentos se publiquen en función de la información almacenada en los propios documentos.

Diagrama de arquitectura de seguridad con middleware y restricción.

La etapa $redact tiene la siguiente forma de prototipo:

{ $redact: <expression> }

El argumento puede ser cualquier expresión válida siempre que se resuelva a las variables de sistema $$DESCEND, $$PRUNE o $$KEEP. Para obtener más información sobre expresiones, consulta Expresiones.

Variable del sistema
Descripción

$redact devuelve los campos en el nivel actual del documento, excluyendo los documentos incrustados. Para incluir documentos incrustados y documentos incrustados dentro de arreglos, aplicar la expresión $cond a los documentos incrustados para determinar el acceso para estos documentos incrustados.

$redact excluye todos los campos a este nivel de documento/documento incrustado actual, **sin** una inspección más detallada de ninguno de los campos excluidos. Esto se aplica incluso si el campo excluido contiene documentos incrustados que pueden tener diferentes niveles de acceso.

$redact devuelve o mantiene todos los campos en este documento actual/documento incrustado, **sin** realizar una inspección adicional de los campos a este nivel. Esto aplica incluso si el campo incluido contiene documentos incrustados que pueden tener diferentes niveles de acceso.

Los ejemplos de esta sección utilizan el asistente db.collection.aggregate().

Una colección de forecasts contiene documentos de la siguiente forma donde el campo tags lista los diferentes valores de acceso para ese nivel de documento/documento incrustado; es decir, un valor de [ "G", "STLW" ] especifica que "G" o "STLW" pueden acceder a los datos:

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

Un usuario tiene acceso para ver información con la etiqueta "STLW" o "G". Para ejecutar una query en todos los documentos con el año 2014 para este usuario, incluye una $redact fase como se muestra a continuación:

var userAccess = [ "STLW", "G" ];
db.forecasts.aggregate(
[
{ $match: { year: 2014 } },
{ $redact: {
$cond: {
if: { $gt: [ { $size: { $setIntersection: [ "$tags", userAccess ] } }, 0 ] },
then: "$$DESCEND",
else: "$$PRUNE"
}
}
}
]
);

La operación de agregación devuelve el siguiente documento "redactado":

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

Una colección accounts contiene el siguiente 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"
}
)

En este documento de ejemplo, el campo level determina el nivel de acceso necesario para ver los datos.

Para ejecutar una query en todos los documentos con estado A y excluir todos los campos contenidos en un documento/documento incrustado en el nivel 5, incluye una etapa $redact que especifique la variable del sistema "$$PRUNE" en el campo then:

db.accounts.aggregate(
[
{ $match: { status: "A" } },
{
$redact: {
$cond: {
if: { $eq: [ "$level", 5 ] },
then: "$$PRUNE",
else: "$$DESCEND"
}
}
}
]
);

La $redact etapa evalúa el campo level para determinar el acceso. Si el campo level es igual a 5, entonces excluye todos los campos en ese nivel, incluso si el campo excluido contiene documentos incrustados que puedan tener valores level diferentes, como el campo shipping_addr.

La operación de agregación devuelve el siguiente documento "redactado":

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

El conjunto de resultados muestra que la etapa $redact excluyó el campo cc en su totalidad, incluido el campo shipping_addr que contenía documentos incrustados con valores de campo level igual a 3 y no a 5.

Tip

Implementar restricción a Nivel de campo para ver los pasos que permiten configurar múltiples combinaciones de acceso para los mismos datos.

Para obtener más información sobre las variables del sistema en esta guía, consulte la página de Variables de Agregación.