Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

$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 $redact El escenario tiene la siguiente forma de prototipo:

{ $redact: <expression> }

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

Variable del sistema
Descripción

$$DESCEND

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

$$PRUNAR

$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.

$$KEEP

$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 sobre todos los documentos con año 2014 para este usuario, incluye una etapa $redact como en lo siguiente:

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

Tip

  • $size

  • $setIntersection

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 etapa $redact 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 excluyó el $redact campo cc en su totalidad, incluido el shipping_addr campo que contenía documentos integrados 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.

Volver

$rankFusion

En esta página