Definición
$redactRestringe la salida de documentos completos o del contenido dentro de los documentos en función de la información almacenada en los propios documentos.
La etapa
$redacttiene la siguiente forma de prototipo:{ $redact: <expression> } El argumento puede ser cualquier válido. expresión siempre que se resuelva en las
$$DESCEND$$PRUNE$$KEEPvariables de sistema, o. Para más información sobre expresiones, consulte Expresiones.Variable del sistemaDescripción- $$DESCEND
- $$PRUNAR
$redactexcluye todos los campos en el nivel actual de documento/documento incrustado, sin inspeccionar ninguno de los campos excluidos. Esto aplica incluso si el campo excluido contiene documentos incrustados con diferentes niveles de acceso.- $$MANTENER
$redactdevuelve o conserva todos los campos en el nivel actual del documento/documento incrustado, sin necesidad de inspeccionarlos. Esto aplica incluso si el campo incluido contiene documentos incrustados con diferentes niveles de acceso.
Ejemplos
Los ejemplos de esta sección utilizan el db.collection.aggregate() ayudante.
Evaluar el acceso en cada nivel del documento
Una colección forecasts contiene documentos del siguiente formato, donde el campo tags enumera 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." } ] }
Excluir todos los campos en un nivel determinado
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 requerido 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, 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 integrados que tenían level valores de campo iguales a 3 y no 5 a.
Tip
Implementar la redacción a nivel de campo para los pasos a seguir para 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 canalización que conserva los documentos cuyo valor del campo imdb.rating es mayor o igual a 9. La etapa excluye todos los demás documentos. A continuación, el ejemplo ejecuta la canalización de agregación:
const pipeline = [ { $redact: { $cond: { if: { $gte: ["$imdb.rating", 9] }, then: "$$KEEP", else: "$$PRUNE" } } } ]; const cursor = collection.aggregate(pipeline); return cursor;