No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Filtrado de documentos en MongoDB con operadores condicionales

16/21
Recursos

¿Qué es el operador Redact y cómo puede optimizar tus consultas?

El operador Redact es una herramienta poderosa y peculiar en la manipulación de documentos en bases de datos, específicamente diseñada para incluir o excluir partes de un documento según condiciones específicas. A diferencia de Match, que posiblemente ya hayas utilizado, Redact te permite un control más detallado sobre subdocumentos dentro de un documento. Esto significa un potencial aumento en la eficiencia de tus consultas al decidir qué información mantener o descartar.

¿Cómo trabajar con Redact en MongoDB?

Para entender cómo se implementa el operador Redact, pongamos en práctica un ejemplo concreto: supongamos que necesitamos excluir todas aquellas propiedades de Airbnb con calificaciones menores a 90. Veamos cómo hacerlo:

db.collection.aggregate([
  {
    $redact: {
      $cond: {
        if: { $gte: [ "$Review.Scores.Rating", 95 ] },
        then: "$$KEEP",
        else: "$$PRUNE"
      }
    }
  },
  { $count: "calificaciones Excelentes" }
])
  1. Condicional if: Indicar qué condición deben cumplir los documentos para ser mantenidos. En este ejemplo, se evalúa si las calificaciones son mayores o iguales a 95.
  2. Instrucción then: Si el documento cumple con la condición, se utiliza $$KEEP para conservar dicho documento en las siguientes fases.
  3. Instrucción else: Si no cumple con la condición, se utiliza $$PRUNE para excluirlo.

Elementos clave del código

  • Campo de referencia: Utilizamos "$Review.Scores.Rating" para verificar la calificación de cada propiedad.
  • Condicional explícita: Encierra la lógica dentro del $cond para asegurar que MongoDB reconozca que se está formulando una condición.
  • Contador final: El uso de $count permite saber cuántos documentos cumplen la condición, proporcionando una cifra concreta del filtrado.

¿Qué precauciones debes tomar al usar Redact?

Adoptar el operador Redact debe venir acompañado de precauciones específicas:

  • Evaluar el impacto en recursos: Redact puede ser más demandante en términos de recursos que Match, así que asegúrate de que su uso sea realmente necesario para tus necesidades de filtrado.
  • Cuidado en pipeline: Usar Redact como etapa dentro de un pipeline implica que los documentos y sus respectivos campos, incluidos internamente, serán automáticamente excluidos o mantenidos para las etapas que siguen.

Finalmente, te invitamos a reflexionar sobre otros tipos de consultas donde Redact podría ayudar a resolver problemas de manera directa y eficiente. ¡Comparte tus ideas y desafíos en los comentarios! Así contribuirás al aprendizaje continuo y colaborativo en esta plataforma.

Aportes 4

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

La diferencia entre usar `$$KEEP` y `$$DESCEND` en el contexto del código que proporcionaste radica en cómo se procesan los documentos que no cumplen con la condición del operador `$cond`. **$$KEEP:** * **Mantén el documento:** Si la calificación de Airbnb es inferior a 90, pero se cumple alguna otra condición en la etapa de `$redact` posterior, el documento se conservará. * **Ejemplo:** Si el documento tiene una calificación de 85, pero también tiene una reseña que menciona "ubicación perfecta", el documento se conservará si la etapa posterior de `$redact` filtra por documentos con "ubicación perfecta". **$$DESCEND:** * **Omite el documento:** Si la calificación de Airbnb es inferior a 90, el documento se omite y no se procesa en etapas posteriores de la tubería de agregación. * **Ejemplo:** Si el documento tiene una calificación de 85, no se procesará en la etapa posterior de `$count`, incluso si la etapa filtrara por documentos con una calificación superior a 80. En resumen, `$$KEEP` conserva el documento para su procesamiento posterior, incluso si no cumple con la condición actual, mientras que `$$DESCEND` lo omite de inmediato.
use('sample_airbnb')

db.listingsAndReviews.aggregate([
  {
    $redact: {
      $cond:{
        if: { $gte: ["$review_scores.review_scores_rating", 95] },
        then:"$$KEEP",
        else: "$$PRUNE"
      }
    }
  },
  {
    $count: "count"
  }
])

solución al reto:

Utilizando $redact:

var db=db.getSiblingDB("sample_airbnb")


var resultado = db.listingsAndReviews.aggregate([
    {
        $redact: {
          //condicion
          $cond: {
            if:{$gte:["$review_scores.review_scores_rating", 95]},
            then: "$$KEEP",
            else: "$$PRUNE"
          }
        }
    },
    {
        $count:"cantidad_redact"
    }
]
);

print(resultado)

Utilizando $match:

var db=db.getSiblingDB("sample_airbnb")

var resultado1 = db.listingsAndReviews.aggregate([
    {
        $match: {
            "review_scores.review_scores_rating": { $gte: 95},
        }
    },
    {
        $count:"cantidad_match"
    }
]
);
print(resultado1)

Ejecución y Resultado:

PS D:\Usuarios\Aggregations> mongosh --quiet ./playground-2.redact.mongodb.js
[ { cantidad_redact: 2287 } ]
[ { cantidad_match: 2287 } ]

Desventajas en el uso de $redact:

  • es más costoso que el operador $match
  • Solo excluye a partir de la etapa de la función aggregate donde se utilice $redact.