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 tiene la siguiente forma $redact 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 del documento actual, excluyendo los documentos incrustados. Para incluir documentos incrustados y documentos incrustados dentro de matrices, aplique la $cond expresión a los documentos incrustados para determinar el acceso a estos documentos incrustados.

$redact excluye todos los campos en este documento actual/documento incrustado, sin inspeccionar 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 conserva todos los campos en el nivel actual del documento/documento incrustado, sin inspeccionar más los campos en este nivel. Esto se 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" "G"o. Para ejecutar una consulta en todos los documentos con año 2014 para este usuario, incluya una etapa como se muestra a $redact 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 consulta en todos los documentos con estado A y excluir todos los campos contenidos en un documento/documento incrustado en 5 el nivel, incluya una $redact etapa que especifique la variable del sistema "$$PRUNE" en el then campo:

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

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

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 excluyó el $redact campo cc en su totalidad, incluido el shipping_addr campo que contenía documentos incrustados que tenían level valores de campo iguales a 3 y no 5 a.

Tip

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

Los ejemplos de Node.js en esta página utilizan la base de datos sample_mflix de los conjuntos de datos de muestra de Atlas. Para aprender a crear un clúster gratuito de MongoDB Atlas y cargar los conjuntos de datos de muestra, consulte Primeros pasos en la documentación del controlador de MongoDB Node.js.

Para utilizar el controlador de MongoDB Node.js para agregar una etapa de $redact a una canalización de agregación, utilice el Operador $redact en un objeto de canalización.

El siguiente ejemplo crea una etapa de la pipeline que mantiene los documentos en los que el valor del campo imdb.rating es mayor o igual a 9. La etapa excluye todos los demás documentos. Luego, el ejemplo ejecuta la pipeline de agregación:

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

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