es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo hacer coincidir una cadena dentro de un arreglo embebido o un documento en MongoDB?

Después de buscar durante todo el día, dudo si MongoDB puede cumplir con el siguiente requisito:

P: ¿Cómo puedo filtrar los documentos que cumplen con las siguientes condiciones?

  • En el último elemento del array de students_replies, hay una respuesta de un estudiante cuyo nombre contiene la cadena ‘ason’.
id1: primer colegio, students_replies: [
    {Fecha:20210101, respuestas: [
        {nombre: jack, respuesta: 'No me gusta esta idea'},
        {nombre: jason, respuesta: 'Prefiero quedarme en casa'},
        {nombre: charles, respuesta: 'Tengo un plan para mejorar'},
      ]}, 
    {Fecha:20210401, respuestas: [
        ...]}, 
    {Fecha:20210801, respuestas: [
        ...]},
]
id2: segundo colegio, students_replies: [..]
id3: tercer colegio, students_replies: [...]

Enlace a Mongoplayground

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para filtrar los documentos que cumplan la condición de tener el último elemento del array students_replies que contenga una respuesta de un estudiante cuyo nombre contiene la cadena ‘ason’, podemos utilizar la pipeline de agregación de MongoDB con los operadores de agregación $filter y $regexMatch.

    Aquí hay un ejemplo de pipeline de agregación:

    db.collection.aggregate([
      {
        $project: {
          schools: {
            $filter: {
              input: "$schools",
              as: "school",
              cond: {
                $regexMatch: {
                  input: { $arrayElemAt: ["$$school.students_replies.replies.name", -1] },
                  regex: /ason/i
                }
              }
            }
          }
        }
      }
    ])
    

    Explicación de las etapas de la pipeline:

    1. Etapa $project: Esta etapa se utiliza para especificar los campos que queremos en la salida final. En este caso, queremos mantener el campo schools.
    2. Operador $filter: Este operador se utiliza para filtrar el array schools basado en la condición especificada.

    • Campo input: Este es el array que queremos filtrar, que es el campo schools.

    • Campo as: Este es un identificador arbitrario para cada elemento en el array de entrada.

    • Campo cond: Esta es la condición para el filtrado. Utilizamos el operador $regexMatch para hacer coincidir la expresión regular /ason/i con el último elemento en el array students_replies.replies.name. Utilizamos el operador $arrayElemAt para seleccionar el último elemento del array.

    La pipeline de agregación anterior devolverá solo los documentos donde la última respuesta en el array students_replies.replies.name contiene la cadena ‘ason’.

Comments are closed.